Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式。
小明设计的样式为:第1行蓝色,第2行白色,第3行蓝色,第4行白色,....
现在小明想知道,从第21行到第50行一共包含了多少个 蓝色的行。
请你直接提交这个整数,千万不要填写任何多余的内容。
【分析】取余运算
奇数行蓝色,偶数行白色。
#include <stdio.h>
int main()
{
int i,ans=0;
for(i=21;i<=50;i++)
{
if(i%2==1)
{
printf("%d\n",i);
ans++;
}
}
printf("ans = %d\n",ans);
return 0;
}
【答案】15
2. 立方尾不变
有些数字的立方的末尾正好是该数字本身。比如:1,4,5,6,9,24,25,....
请你计算一下,在 10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个。
请提交该整数,不要填写任何多余的内容。
【分析】数位基本操作(分离+累加求和)
[1, 10000]上的每个i,对其3次方进行数位分离,并从后向前累加求和。当结果与i相等时,说明数字i具有立方尾不变的特征。需要注意保存i的3次方应使用long long int(int超精度)。
#include <stdio.h>
#include <math.h>
typedef long long ll;
int mypow(int a,int n) //求a的n次方
{
int i;
int ret=1;
for(i=1;i<=n;i++)
ret*=a;
return ret;
}
int main()
{
ll i;
ll ans=0; //结果总数
ll temp,curnum,digit; //temp-i^3 curnum-从后向前逐位累加求和结果 digit-数位标记
for(i=1;i<=10000;i++)
{
temp=i*i*i;
curnum=0;
digit=0;
while(temp!=0)
{
curnum+=((temp%10)*mypow(10,digit++));
temp/=10;
if(curnum==i)
{
printf("%lld %lld\n",i,i*i*i);
ans++;
break;
}
}
}
printf("ans = %lld\n",ans);
return 0;
}
【答案】36
3. 三羊献瑞
观察下面的加法算式:
祥 瑞 生 辉
+ 三 羊 献 瑞
-------------------
三 羊 生 瑞 气
(如果有对齐问题,可以参看【图1.jpg】)
其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。
请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。
【分析】枚举+全排列(DFS)
注意到上述加法算式中出现了8个不同的汉字:祥 瑞 生 辉 三 羊 献 气,且代表的数字不同。因此可枚举8个汉字对应的数字的所有可能情况。需要注意:由于祥、三位于最高位,故他们的取值范围为[1, 9],其余为[0, 9]。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[10]={0,1,2,3,4,5,6,7,8,9};
int main()
{
int i;
int n1,n2,sum;
do
{
//祥瑞生辉三羊献气<->a[0]~a[7]
n1=a[0]*1000+a[1]*100+a[2]*10+a[3];
n2=a[4]*1000+a[5]*100+a[6]*10+a[1];
sum=a[4]*10000+a[5]*1000+a[2]*100+a[1]*10+a[7];
//最高位不为0,且满足等式
if(sum==n1+n2 && a[0]!=0 && a[4]!=0)
{
printf("%d + %d = %d\n",n1,n2,sum);
break;
}
} while(next_permutation(a,a+10));
return 0;
}
【答案】1085
4. 格子中输出
StringInGrid函数会在一个指定大小的格子中打印指定的字符串。
要求字符串在水平、垂直两个方向上都居中。
如果字符串太长,就截断。
如果不能恰好居中,可以稍稍偏左或者偏上一点。
下面的程序实现这个逻辑,请填写划线部分缺少的代码。
#include <stdio.h>
#include <string.h>
void StringInGrid(int width, int height, const char* s)
{
int i,k;
char buf[1000];
strcpy(buf, s);
if(strlen(s)>width-2) buf[width-2]=0;
printf("+");
for(i=0;i<width