续 洛谷:第二步和第一步的区别是没有区别(2)https://blog.youkuaiyun.com/Deeplow/article/details/104418360
开始运转头脑 ——在代码之外(数学问题)
Part 1.
洛谷新手村-数组之前的题目(语言:C语言)
(三)循环!循环!循环!
P1008 三连击
【代码】
#include <stdio.h>
int main ()
{
printf("192 384 576\n");
printf("219 438 657\n");
printf("273 546 819\n");
printf("327 654 981\n");
return 0;
}
【分析】???只是提交答案有什么意思?(虽然洛谷允许这样做)
但是这段代码本身没有意义。
【代码】
#include <stdio.h>
int main()
{
int a,b,c;
for(a=123;a<=333;a++)
{
b=a*2;
c=a*3;
int s1 ;
s1 =a/100+a/10%10+a%10+b/100+b/10%10+b%10+c/100+c/10%10+c%10;
//求出a,b,c三个数字中每个数位的数字的和
int s2 ;
s2=1+2+3+4+5+6+7+8+9;
int p1;
p1=(a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*(b%10)*(c/100)*(c/10%10)*(c%10);
//求出a,b,c三个数字中每个数位的数字之积
int p2;
p2=(1)*(2)*(3)*(4)*(5)*(6)*(7)*(8)*(9);
if(s1 == s2 && p1 == p2 )
printf("%d %d %d\n",a,b,c);
}
return 0;
}
【分析】这纯粹就是数学问题了,对于代码本身没有什么难度。
该数学问题就是通过两个集合满足三个条件,可证明这两个集合相等
(在题设条件下):
(两个集合)
①元素个数相同;
②所有元素之和相同;
③所有元素之积相同。
如何证明这个问题呢?
说实话以我的水平不会,如果有大佬来解答,感激不尽
P1035 级数求和
【代码】
#include <stdio.h>
int main ()
{
int k;
scanf("%d",&k);
double sum=0,n=0;
while (sum <= k)
{
sum = sum +1/n;
n++;
}
printf("%.0f",n);
return 0;
}
【分析】
1、简单的递增——对某些数列求和的实现;
2、设置为浮点数是为了防止1/n的实数化,造成错解。
P1423 小玉在游泳
【代码】
#include <stdio.h>
int main ()
{
double x=0;
scanf ("%lf",&x);
double X=2,S=2;
int i=0;
while ( S<=x){
i++;
X=X*0.98;
S=S+X;
}
printf("%d",i+1);
return 0;
}
【分析】因为第一步已经算了初始的2米(S的初始值为2),所以最后输出的时候结果要加一。
P1424 小鱼的航程(改进版)
【代码】
#include<stdio.h>
int main()
{
int x,n,s;
scanf("%d%d",&x,&n);
s=250*n;
for(int i=1;i<=n;i++)
{
if(x==6||x==7)
s-=250;
x++;
if(x>7)
x-=7;
}
printf("%d",s);
return 0;
}
【分析】这一题运用的思想是:先假设每一天小鱼都在游泳;然后每逢周六周日都减去当天的份额;但是为了避免星期数大于7,设置if语句保证符合实际。
P1980 计数问题
【代码】
#include<stdio.h>
int main()
{
int n,i,x,b,c,t=0;
scanf("%d%d",&n,&x);
for(i=1;i<=n;i++)//一到n进行循环;
{
b=i;//为了不改变i的值,就把i赋值给一个数;
while(b!=0)//如果b不等于0,继续循环;
{
c=b%10;//求是否是x,是的话计数器加一;
b=b/10;//求下一个数字是否为x;
if(c==x)
t++;//计数器加一;
}
}
printf("%d",t);//输出计数器的数字;
return 0;//结束
}
【分析】该题和翁恺老师说的数位数这一题非常相似。
多调试几次就能了解其中的原理(其实只有像我这种新手才需要这么做/滑稽)
//数位数
#include <stdio.h>
int main ()
{
int x;
int n =0;
scanf("%d",&x);
do
{
n++;
x/=10;
}
while( x>0 );
printf("%d\n",n);
return 0;
}
暂列于此。