Alpha_dllg的个人空间 https://blog.eetop.cn/1010876 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

C语言值循环的数学应用

已有 789 次阅读| 2012-10-20 16:37 |个人分类:C语言学习篇

天气: 天黑了
心情: 小压抑
        本节内容我们稍微进阶一下,利用循环求解一些特殊的问题。

1、有这样一个等式,xyz+yzz=532,编程求x,y,z的值。

        没有技术要点,采用穷举法,当然这里面有一个可优化的条件:就是4=<X+Y<=5
可以利用其来优化程序,但是这里面求的是一个常数,如果换一个数据呢,所以我们
可以把最高位当作一个优化因子,在进行大规模的数据计算时,可以节约大量的时间。

        对这个三位数,我们可以考虑四种情况,分别是十位和个位的进位与否;基于不
同的情况 列三个等式然后求解即可。但是等式的求解还是比较麻烦的,虽然用穷举法
会显得自己比较笨,但是也不失为一种好办法。

void main()
{
 int num ;
 printf("please input n:\n");
 scanf("%d",&num);
 int x,y,z,i=0;
 int a=num%10;
 int b=(num/10)%10;
 int c=num/100;
 int flag=1;
 while(i<4)
 {
  switch(i)
  {
   case 0:   //个位、十位均无进位
   z=a/2;
   y=b-z;
   x=c-y;
   break;
   case 1:   //个位有进位
   z=(a+10)/2;
   y=b-z-1;
   x=c-y;
   break;
   case 2:   //十位有进位
   z=a/2;
   y=b-z+10;
   x=c-y-1;
   break;
   case 3:   //十位、个位均有进位
   z=(a+10)/2;
   y=b+10-z-1;
   x=c-y-1;
   break;
   default:break;

  }
  i++;
  if(x>0&&y>0&&z>=0) 
  {
   printf("x=%d,y=%d,z=%d",x,y,z);
   flag=0;
  }
}
if(flag)
printf("No resault!\n");
}
       这样写只是运行的快,但是你也发现了:好长啊!!!

2、一元钱兑换方案

为了说明上述方法与穷举法的差别,下面用一句简洁的代码完成一元钱的兑换方案

void main()
{
 int i,j,k;
 for(i=0;i<=10;i++)
 for(j=0;j<=5;j++)
 for(k=0;k<=2;k++)
 if(i+j*2+k*5==10)
 printf("yijiao %d ,liangjiao %d ,wujiao %d \n",i,j,k);
}

3、对调数问题
     举个例子吧 56+21=65+12
    我们的任务就是当给出一个对调数时,求出满足条件的另一个对调数。

void main()
{
 int x,y,z,x1,y1,z1,i,k,n,j=0;
 while(1)
{
 printf("please input a integer\n");
 scanf("%d",&n);
 if(n<=10||n>=100)
 {
  printf("data error\n");
  continue;
 }
 else if (n%10==0)
 {
  printf("data error\n");
  continue;
 }
 else if(n%10==n/10)
 {
  printf("data error\n");
  continue;
 }
 else
{
 x=n/10;
 y=n%10;
 z=10*y+x;
 break;
}
}
for(i=11;i<100;i++)
{
if(i%10==0)
continue;
else
{
x1=i/10;
y1=i%10;
z1=y1*10+x1;
if(n+i==z+z1&&n!=z1)
{
printf("%d+%d=%d+%d\n",n,i,z,z1);
j++;
}
else
continue;
}
}
if(j==0)
printf("inexistince\n");
}

4、求解平方和问题,这是今天的最后一个题目,而且也是很有意思的一个题目:
任意给出一个自然数K(k!=0),计算其各位数字的平方和k1,在计算k1各位数字的
平方和k2,重复此过程,最终将得到数1或145,此时在做数的平方和运算它最终结果将始终是1或145.

void main()
{
long a[10],n,i;
p:
printf("please input a number:\n");
scanf("%d",&n);
if(n==0)
goto p;
while(n!=1&&n!=145)
{
printf("n=%ld->",n);
i=1;
while(n>0)
{
a[i++]=n%10;
n/=10;
}
n=0;
i--;
while(i>=1)
{
printf("%ld*%ld",a[i],a[i]);
if(i>1)
printf("+");
n+=a[i]*a[i];
i--;
}
printf("=%ld\n",n);
}
}

大家要注意一下break和continue的特性,而且个人建议的话goto语句能不用就不用...


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 2

    评论
  • 304

    访问数
关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-28 23:51 , Processed in 0.014208 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部