【C/PTA——循环结构3】

10 篇文章 0 订阅
4 篇文章 0 订阅

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;
}
  • 34
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值