分支和循环(一)的一些题目及知识补充

一些零碎的知识补充

  • typedef是一个关键字,可以用来给类型起别名
#include<stdio.h>
int main()
{
   typedef int INT;
   INT a=0;
   printf("%d\n",a);
   return 0;
   }
  • EOF为文件结尾标识符
  • continue一定出现在循环中
  • define是编译器的关键字,用于预处理,不是C语言的
  • i=a,b,ci=(a,b,c)是不一样的,前者 i 的结果是c,后者 i 的结果是a

一些题目

求水仙花数

请输出所有的水仙花数。 所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。
例如,153是水仙花数,因为153=1^3 + 5^3 + 3^3。

思路:先把三位数拆开再用if限定水仙花数

#include<stdio.h>
#include<math.h>

int main()
{
   int i = 0;
   for(i = 100; i <= 999; i++)
   {
      int a = i / 100, A = pow(a, 3);//求出i的百位数并立方
      int b = i / 10 - a * 10, B = pow(b, 3);//求出i的十位数并立方
      int c = i % 10, C = pow(c, 3);//求出i的个位数并立方
      if(i == A + B + C)
        {
         printf("%d\n", i);
         }
   return 0;
}

  • pow函数是给变量乘方的函数,格式为pow(a, b),表示a的b次方
  • if括号内可以替换成i == a*a*a + b*b*b + c*c*c,但是不能用^,因为它在C语言中是异或运算符
  • if括号后一定不能加分号,因为这样相当于if语句控制了一条空语句,就没有起到限定的作用

输出100~200之间所有的素数

思路:

  1. 假设一个数 i,用2 ~ i-1(根号 i 更优)的数一个个试,如果有一个能够整除,那就不是素数

  2. 用if语句试出非素数后,过滤掉它们,打印出剩下的数

#include<stdio.h>
#include<math.h>

int main()
{
   int i = 0;
   for(i = 101; i <= 199; i += 2)
   {
      int flag = 1;
      int j = 0;
      for(j = 2; j <= sqrt(i); j++)
      {
         if(0 == i%j)//判断是否有除了1和i外的数整除i
         {
           flag = 0;//如果有,flag就为0,不打印
           break;//如果有可以整除的,提前跳出循环
         }
      }
         if (flag)//对于i=101,试完了所有j没有可以整除的,循环完毕,flag=1
        {
         printf("%d ", i);
        }
    }
    return 0;
}
  • int flag = 1一句只能放在for循环里,不能放在外面,不然只能输出101和103,因为在判断到105时,flag的值变成了0,如果没有给它重新赋上1,它就一直是0,后面的素数就都打印不出来了
  • 此处限定 j 最大为根号 i ,以及设置 i +=2,可以大大减少要测试的数据,是程序的优化
  • if语句的后面最好打上大括号

计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果

思路:表示出1/i,逢单相加逢双相减

#include<stdio.h>

int main()
{
   int i = 1;  
   float sum = 0;

   for(i = 1; i <= 100; i++)
   {
      float j = 1.0 / i;//这里的1必须带小数点
      
      if(0 == i % 2)
         sum -= j;
      else
         sum += j;
   }
   printf("%f", sum);
   
   return 0;
}
  • 这里的float j = 1.0 / i;也不能放在外面,否则就变成了1-1+1-1…-1(100个),最终结果为0.000000
  • 整数相除是先取整数部分再转化为浮点数,所以如果没有写小数点,最终结果就是1-0+0-…-0,最终结果为1.000000

在屏幕上打印九九乘法表

思路:用两个循环,第一个循环中的a乘上第二个循环中的b

#include<stdio.h>

int main()
{
   int a = 0;
   for(a = 1; a <= 9; a++)
   {
      int b = 0;
      for(b = 1; b <= 9; b++)
      {
         printf("%d * %d = %d ", a, b, a*b);
         if(a == b)
           {
             printf("\n");
             break;
           }
      }
   }
   return 0;
}
  • 此处的break让该代码直接跳到a++阶段,就可以从2*2=4处换行跳到3,从而使得乘法表呈三角形,更加美观

编写程序数一下 1到 100 的所有整数中出现多少个数字9

思路:遇到9计数器就+1

#include<stdio.h>

int main()
{
   int i = 0;
   int count = 0;
   for(i = 1; i <= 99; i++)
   {
      if(i / 10 == 9)
        count++;
      if(i % 10 == 9)
        count++;
   }
   printf("%d", count);
   return 0;
}
  • 其中的两个if不能合并,不然99只会算到一个9

写代码将三个整数数按从大到小输出

思路:认为把大小顺序换成a>b>c,如果a更小就把a换成更大的数

#include<stdio.h>

int main()
{
   int a = 0;
   int b = 0;
   int c = 0;
   while(scanf("%d %d %d", &a, &b, &c)!= EOF)
   {
   if(a < b)
     {
        int x = a;
        a = b;
        b = x;
     }
   if(a < c)
     {
        int y = a;
        a = c;
        c = y;
     }
   if(b < c)
     {
        int z = b;
        b = c;
        c = z;
     }
     printf("%d %d %d", a, b, c);
    }
   
   return 0;
}
  • 此处while(scanf("%d %d %d", &a, &b, &c)!= EOF)是多组输入(下面要打大括号但是后面不能有分号)
  • 注意这个printf函数如果放在while语句的外面,就会导致要按ctrl+Z强制结束读取后才能出结果(因为只要有输入while语句的条件一直都符合)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值