C/PTA——循环结构3
- 7-1 二分法求多项式单根
- 1.题目要求
- 2.代码实现
- 7-2 循环-十进制转化
- 1.题目要求
- 2.代码实现
- 7-3 梅森数
- 1.题目要求
- 2.代码实现
- 7-4 单词长度
- 1.题目要求
- 2.代码实现
- 7-5 21循环-求和3
- 1.题目要求
- 2.代码实现
- 7-6 21循环-金字塔
- 1.题目要求
- 2.代码实现
- 7-7 循环-杨辉三角
- 1.题目要求
- 2.代码实现
7-1 二分法求多项式单根
1.题目要求
2.代码实现
#include <stdio.h>
double a3, a2, a1, a0;
double f(double x)
{
double result;
result=a3*x*x*x+a2*x*x+a1*x+a0;
return result;
}
int main()
{
double a, b;
scanf("%lf%lf%lf%lf",&a3,&a2,&a1,&a0);
scanf("%lf%lf",&a,&b);
double left,mid,right;
left=a;
right=b;
///大于阈值时使用二分法求出单根,程序结束
while(right-left>=0.001&&f(left)*f(right)<=0)
{
if(f(left)==0)
{
printf("%.2f",left);
return 0;
}
if(f(right)==0)
{
printf("%.2f",right);
return 0;
}
mid=(left+right)/2;
if (f(mid)*f(left)>0)
{
left=mid;
}
else //由于先决条件为f(left)*f(right)<0,因此此时else语句等价于f(mid)与f(left)异号,即与f(right)同号
{
right=mid;
}
}
不大于阈值时输出中点
printf("%.2f",mid);
return 0;
}
7-2 循环-十进制转化
1.题目要求
2.代码实现
#include<stdio.h>
#include<math.h>
int Coun(int n,int m)//进制转化,位数计算函数
{
int count = 0;
while (n)//统计进制转换后,数字位数的统计
{
count++;
n /= m;
}
return count;
}
int main()
{
int n, m;
int sum = 0;
scanf("%d %d", &n, &m);
int count = Coun(n, m);
int num = count;
while (n)
{
sum = sum + (int)pow(10, num - count) * (n % m);
n /= m;
count--;
}
printf("%d", sum);
return 0;
}
7-3 梅森数
1.题目要求
2.代码实现
#include<stdio.h>
#include<math.h>
int main()
{
int n = 0, num = 0;
int count = 0;
scanf("%d", &n);
for(int j=2;j<=n;j++)
{
for (int i = 2; i < ((int)pow(2,j)-1); i++)
{
if (((int)pow(2, j) - 1) % i == 0)//素数的判断
count++;
}
if (count == 0)//梅森数的判断
{
printf("%d\n", (int)pow(2, j) - 1);
num++;
}
count = 0;//判断完一个后,计数置0
}
if (num == 0)//不存在梅森数的情况
printf("None\n");
return 0;
}
7-4 单词长度
1.题目要求
2.代码实现
#include<stdio.h>
int main() {
char s[100] = { 0 };
char* p = &s;
int i = 0;
scanf("%[^.]", s);//[^.]是输入到.前面位置,遇到.结束输入
for (; *(p) != 0; p = p + 1)
{
if (*(p) != ' ')
i++;
if (*(p) == ' ' && *(p + 1) == ' ')
continue;//吞多余空格
if (*(p) == ' ' && *(p + 1) != 0 && i != 0)
{
printf("%d ", i);
i = 0;
}//输出前面单词的数目,i!=0有效解决了开头多空格问题
if (*(p + 1) == 0)//输出最后一个单词的数目
printf("%d", i);
}
return 0;
}
7-5 21循环-求和3
1.题目要求
思路:
1.使用两个嵌套的for循环,外层循环控制1到n的遍历,内层循环控制1到k的遍历。
2.在内层循环中,每次将total乘以当前外层循环的迭代变量i,并取结果对114514取模(%)。
3.在外层循环中,将计算得到的total累加到sum上,并将结果对114514取模,再重新将total置为1。
2.代码实现
#include<stdio.h>
int main()
{
int n, k;
scanf("%d %d", &n,&k);
int total = 1;
int sum = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= k; j++)
{
total = (total * i) % 114514;
}
sum = (sum + total) % 114514;
total = 1;
}
printf("%d", sum);
}
7-6 21循环-金字塔
1.题目要求
2.代码实现
#include<stdio.h>
int main()
{
int n, m = 0, k, i = 1, j;
scanf("%d", &n);
if (n == 1) {
printf("1");
return 0;
}
while (n > m) {
m = (i + 1) * (i + 2) / 2;
i++;
k = (i + 1) * (i + 2) / 2;
if (n <= k) {
n = i - 1;
}
}
for (i = 0; i <= n; i++) {
for (j = 0; j < n - i; j++) {
printf("0");
}
printf("%d", n + 1 - i);
for (k = 1; k <= i; k++) { //for循环里面套了三个并列的for循环,每次重新进入内部循环时,k都会重新赋值为1;这个循环很巧妙,第一次无法进入,第二次以后就可以,并且循环次数逐一增加。
printf("0%d", n + 1 - i);
}
for (j = 0; j < n - i; j++) {
printf("0");
}
printf("\n");
}
return 0;
}
7-7 循环-杨辉三角
1.题目要求
2.代码实现
#include<stdio.h>
int main() {
int n, m;
int k = 0;
scanf("%d %d", &n, &m);
if(n>m)
{
int tmp=n;
n=m;
m=tmp;
}
int triangle[22][22] = { 0 }; // 初始化为0
for (int i = 1; i <= 21; i++) {
triangle[i][1] = 1;
for (int j = 2; j <= i; j++) {
triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
}
}
for (int i = n; i <= m; i++)//空格的输出
{
for (k = m - i; k >= 1; k--)
{
printf(" ");
}
for (int j = 1; j <= i; j++)
{
if(j<i)
printf("%d ", triangle[i][j] % 10);
if (j == i)
printf("%d", triangle[i][j]);// 取最后一位
}
printf("\n");
}
return 0;
}