n++  先进行其他的,最后再给n++
++n 先给n加再进行其他运算

Description
输入三个整数x,y,z,请把这三个数由大到小输出

方法:比较每个数并相交换,顺序输出
条件需要看清楚if(n <= 100 && n >= 90)
 = 是题目要求的,不能漏

类型转换不能再 * 1.0 而是强制转换 (float)
200~299之间的所有素数,每8个数就换行。注意:每一行第一个数字(如211  257)前无空格,每一行最后一个数字(如251  293)后面无空格。
#include <stdio.h>
#include <math.h>
int main()
{
int n,a,b,c,d,m,sum,count;
bool is = true; // 布尔值判断 
sum =0;
count = 0; // 初始化 
for (int i =200;i < 300;i++)
{
    for(int k = 2;k<= sqrt(i);k++)
    {
        if(i%k==0)
        {
            is = false;
            break;
        }
    }
    if(is ==true)
    {count++;
            if(count == 8)
            {
                count =0;
            printf("%d\n",i);
            }
            else
            printf("%d ",i);
    }
    is = true;
}
return 0;
} 
#include <stdio.h>
#include <math.h>
int main()
{
int n,b,c,d,m,sum,count;
float a,cc;
a=0;
scanf("%f %d",&a,&b);
cc = a;
for(int i =2;i<=b;i++)
{cc= cc*a;}  // 不能写成  a * a 因为这是自乘法 
printf("%.2f",cc); 
return 0;
} 
Description
输入一个整数,求它的各位数字之和及位数。例如-234的各位数字之和是9,位数是3.

Input
输入一个整数n

Output
求它的各位数字之和及位数,注意处理数字0哦。
#include <stdio.h>

int main(){
int a,c,sum=0,count =0;
scanf("%d",&a);

if(a<0)
a = -a; 

if(a == 0)
{
    count++;
}
else
{    
while (a / 10 !=0 || a % 10 !=0) //***
{
sum += a%10;
a /= 10;
count++;
}
}
printf("%d %d",sum,count);
    return 0;
}
Description
输入一个正整数N和N个正整数,统计其中素数的和。

Input
输入一个正整数N(1≤N≤100)和N个正整数(≥3),用空格分隔。

Output
输出所有素数,用空格隔开;再输出这些素数和。

#include <stdio.h>
#include <math.h> 
int main()
{
  int i,n,s,t,k;
  scanf("%d",&n);
  s=0;
  for(i=1;i<=n;i++) //总共n个数 
{
   scanf("%d",&t);  
   for(k = 2;k<=(int)sqrt(t);k++) //这里面 (int) 是截取绝对值 
   {
    if(t % k == 0)  
     {
     break; // 如果 发现第三个因子 则自动退出循环,此时循环应该只进行了一半,k的值可能很小 
     }
   }
   //注意这里楼上的for循环已经结束了,是单独进行if判断,只进行一次 
   if(k ==(int)sqrt(t) + 1 && t != 1)  //1不是素数,k应该是 (int)sqrt(t) + 1
   {
   printf("%d ",t); 
   s=s+t;  
   }
   
   //循环到这里 i++ 
}
  printf("s=%d",s);  //输出答案 
  return 0;
}

Problem L: 多项式求和x+(x^2)/2!+(x^3)/3!+...

#include <stdio.h>
#include <math.h>
int main(){
int c,count =1;
float a,sum,tmp;
scanf("%f",&a);
sum = a;
tmp = a;
while(fabs(tmp) > 0.00001)
    {
        count++;
        tmp = pow(a,count);
        for(int i =1;i<=count;i++)
        tmp /= i;
        sum += tmp;
    }
    printf("%.3f",sum);
    return 0;
}
针对上面的代码我们进行分析
double a,sum,tmp;
scanf("%lf",&a);
也可以改成
float a,sum,tmp;
scanf("%f",&a);

注意:double比float精度高,double用%lf,float用%f,用反会错。

abs函数输入数据类型是int,返回值类型同输入参数
fabs数据类型是double,fabsf是float
如果应该用fabs而用成abs,结果取整了会不对!!

但将上述的代码 fabs、absf 修改后 都能运行
因为float小数支持六个精度,题目要求小于0.00001,我们定义的可以达到最小0.000001
学生案例  ①

#include <stdio.h>
#include <math.h> 
int main()
{
int i;
float t,x,p,s,total;

scanf("%f",&x);
t=1;s=0;i=1;p=1;

total = x;

while(fabs(total)>0.00001)    //单精度除整数会出现什么情况呢? 
{
t = t * i ;  //分母   整数 
p = p * x; //分子   小数 

total = p/t;
// printf("%lf\n",total);  //出现了ERROR 我们在这里DEBUG一下,发现 total先递减,但是递减
//到0.00*的时候突然变成了负数,Speculate:这可能和  小数/整数  有关 
//于是我们把最上面的 参数定义 t 移动到 float 里  构成 小数/小数 
/*
int i,t;
float x,p,s,total;

改为 

int i;
float t,x,p,s,total;
 */
s = s + total; 
i++;
//printf("%d\n",i);
} 
printf("%.3f\n",s);
return 0;
}
学生案例  ②

#include <stdio.h>
#include <math.h>
int main()
{
  int n,i;
  float x,s,k,t;
  float item;
  s=0;i=1;t=1;k=1;
  scanf("%f",&x);
  //在C语言中,由于局部变量Item未定义,刚开始会是一个随机值,导致程序运行失败 
  item = x;   //新添加的语录 
   
  while(fabs(item)>=0.00001){
    t=t*i;
    k=k*x;
    item=k/t; //可以很明显的看出,这里也犯了和楼上一样的错误,所以进行修改 
    //我们把 t 整数类型 改为小数类型 
    s=s+item;
    i++;
  }
  printf("%.3f",s);
  return 0;
}
求知精神:为什么上面不改t(整数)的值类型为小数就不能成功了呢?

资料查找后发现:C语言baiint的取值范围在32/64位系统中都是32位
范围为-2147483648~+2147483647,无符号情况下表示为0~4294967295

在调试的使用使用 Sleep 函数每秒计算,从左到右 分母,分子,该项结果

分母(阶乘)如果作为int类型的话,你可以看到后面 10! 次后就超出范围了
再接下来的数据就不可控了,最多只能进行十次循环

而C语言中,float 为单精度浮点数,占4字节,其数值范围为3.4E-38 ~3.4E+38

将分母类型从Int改为Float,允许其进行多次循环,而不是Int时的最多的十次

1605261424(1).jpg

标签: none

添加新评论