打印

小菜菜准备学C

今天心情不是很好,突然之间没有心思干任何事情,不知道是不是学不进去了,刚才看了看论坛其他的帖子,人家水平那么高,我得学到哪一年能赶上人家,还有看看csdn的新闻,什么开发呀,技术呀,我一个都不明白呀,而且昨天第一次去了我女朋友家,就是前几天见的那个,和他爸爸聊会天,给人的感觉他爸爸这个人很狂,我很不喜欢他爸爸说话的方式。总之,我也不知道为什么,就是心情不好。

TOP

鸿运当头,恭喜您获得 1 金币
最近还在做经典程序一百例,发现了几个数学问题的

算法,以及我以前例子,想些一个总结的文章,包括以前

的例子,就是几个数学的概念:
  包括素数,和数,约数,
  分解质因数,求最大公约数,最小公约数,求水仙花数,

验证哥德巴赫猜想,总结他们的共同点和所使用的方法.
他们之间使用的一个最常用的算法就是求余,看看是不

是余数为0,这个是一个重要的判断标准.
  最基本的就是素数这个概念,它是一个最基础的东西,

哥德巴赫猜想,以及因数,都有赖于这个判定函数的给出
所以,要想盖大楼,最基础的砖块就是给定一个判断素数

的函数,从它的概念入手,什么叫做素数?只有1和他本身

,没有别的约数的数,所以我们可以考虑用2和它的一半

去除它,看看是否有余数,如果余数为零,那么,它就是和

数,为什么循环到它的一半就行了呢?因为到一半,得出

的结果一组,除另一半,就相当于交换了除数和被除数的

位置,除到一半,出没有除开已经一目了然,前一半没有

除开,后一半可定也不会除开,因为知识交换了除数和被

除数的位置.所以,我们就此写出判断素数的程序:

     int sushu(int m)
    {
      int i,n=1;
      for(i=2;i<=m/2;i++)
       if(m%i==0)
         n=0;
      return(n);
     }
函数的返回值不能搞反,是素数,返回1,不是,返回0
以前,我有一种写法,是不对的。
   int sushu(int m)
    {
      int i;
      for(i=2;i<=m/2;i++)
       if(m%i==0)
         return(0);
        else
         reurn(1);
     }
  这个写法就不对了,因为i是一个循环递加的过程,

也许当i得2的时候,初步开,返回1,但是当i得3的时

候,又返回0,这样程序会混乱的,所以,得有一个跟

踪变量,当然,变量只要跟踪,如果得0的时候,变量

的值改变,然后返回这个变量n就可以了。
  它的一个应用就是哥德巴赫猜想:它的命题是一个大

偶数可以分解成两个素数之和,1不是素数,2不是素数

,从3开始吧那就,从键盘接受一个大偶数,然后,从3

开始,一直到循环到那个大偶数,判断其中的素数,判

断一个是素数,就用大偶数减素数,在判断这个差是不

是素数,如果是,输出,如果不是,进行下一轮。
  main()
{
  int m,i;
  scanf("%d",&m);
  for(i=3;i<=m;i++)
  if(sushu(i)&&sushu(m-i))
   printf("%d=%d+%d",m,i,m-i);
  }
  这个程序还没有在tc上调试呢
下面一个就是我还不太明白的地方,就是把一个数分解

成质因数相乘的形式,比如9=3*3,但是,也就是素数

相乘的形式。他的项数很多了,
  他的算法分为两步,第一步就是从2开始一直到他本

身,循环去除它,看看哪一个是他的约数
   第二步,如果他能够整除,就显示这个约数,然后

把商赋值回来,然后再看看还有没有该约数,如果有在

重复循环,直到和这个约束一边大,或者不能整除为止


   main()
  {
    int m,i;
    scanf("%d",&m);
    printf("%d=",m);
    for(i=2;i<=m;i++)
     {
       while(m!=i)
       {
         if(m%i==0)
          printf("%d*",i);m=m/i;
         else
          break;
         }
       }
    printf("%d",m);
}
我一直觉得这个分解质因数的程序能用递归来实现,可

是想起来一时间又没有头绪。

TOP

这个双休日连续几天都没有更新,是因为都忙于个人问题,这个年龄学习真的是有很多阻力,很多问题都牵扯你的精力,尤其是恋爱问题.
   下面写一个求水仙花数的程序,也是经典程序100例中的题目:
   打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
     很简单的一道题目,很快,我的思维方式就有了,而且写出了程序。
    main()
    {
      int i,j,k;
      for(i=1;i<=9;i++)
        for(j=0;j<=9;j++)
         for(k=0;k<=9;k++)
          if(i*i*i+j*j*j+k*k*k==100*i+10*j+k)'
            printf("%d%d%d  ",i,j,k);
      }
   看到答案,他是用了另外一种方法来求一个三位数的百位十位个位,很有借鉴意义。
      
       main()
       {
         int n,i,j,k;
         for(n=100;n<=999;n++)
          {
            i=n/100;
            j=n/10-i*10;
            k=n%10;
           if(i*i*i+j*j*j+k*k*k==n)
            printf("%d%d%d",n);
           }
}
求一个数的位数,可以用这样的算法:
           比如三位数,百位上的数就是:n/100
           以此类推,各位上的数字就是求于。

   下面一道题:求两个数的最大公约数,最小公倍数
  
     main()
    {
      int m,n;
      scanf("%d%d",&m,&n);
     if(m>n) 把最小的数字放到前边,循环的时候好用
     { t=m;
      m=n;
      n=t;}
      for(i=2;i<=m;i++)
       if(m%i==0&&n%i==0)
           t=i;  找到最大的约数
printf("%d%d",t,m*n/t);他们两个的积除以最大公约数,就是最小公倍数.
    }

TOP

s=a+aa+aaa等等,输入两个数,一个是a,一个是加的个数。
该题主要是两个迭代,一个是每一项的构造,然后是求每一项加起来的和.

main()
{
int a,n,i,sum,he=0;
scanf("%d%d",&a,&n)
for(i=1;i<=n;i++)
     he=he+a;
     a=a*10;  
    sum=sum+he;
   }
}
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
                     第10次落地时,共经过多少米?第10次反弹多高?

   main()
  {
    int sum=100,s=100/2,n=10;
    初始值定义的就是第一次的情况,
第一次落地,皮球走了100米,
第一次反弹,皮球反弹了50米,
然后第二次就找到了规律,皮球就反弹了s/2米,皮球就经过了两个s/2因为它有一个反弹就有一个相同的下落,所以在第二次,他们就找到了迭代的规律:
    for(n=2;n<=10;n++)
    {
     s=s/2;
    sum=sum+2*s;  
       }
    printf("%d%d\n",s,sum);
    }

TOP

累了累了,休息一下。
是日记还是??? 进步很快啊!!
MY BLOG

生活就像拉屎,虽然你很努力,可能出来的只是几个屁!但是,如果你不努力,可能屁都没有。
program main
    write(*,*)'弓虽'
end program main
鸿运当头,恭喜您获得 3 金币
供大家参考

TOP

满好的,是转的还是自己的日记啊
呵呵
鹊桥单身群57926878

TOP

:L 够快的
朋友如蜈蚣的手足,女人如过冬的衣服.

TOP


当前时区 GMT+8, 现在时间是 2008-11-22 12:52 苏ICP备06039509号 当当网

Designed By 17DST Discuz! Support Team | Discuz!支持团队