1.问题 A: 守形数
题目描述
守形数是这样一种整数,它的平方的低位部分等于它本身。
比如25的平方是625,低位部分是25,因此25是一个守形数。
编一个程序,判断N是否为守形数。
输入
输入包括1个整数N,2<=N<100。
输出
可能有多组测试数据,对于每组数据,
输出”Yes!”表示N是守形数。
输出”No!”表示N不是守形数。
样例输入
6
11
样例输出
Yes!
No!
分析:
依次比较平方数和给定数的个位,十位,百位,直到给定数的余数为0的时候,就可以判定其为守形数。
代码:
#include <stdio.h>
int main(){
int m,i;
while(scanf("%d",&m)!=EOF){
int a=m*m;
while(m){
if(a%10!=m%10){
printf("No!\n");
break;
}
a/=10;
m/=10;
}
if(!m){
printf("Yes!\n");
}
}
return 0;
}
思路:
首先判断两个数的个位,不同立即输出不是守形数,然后更新变量,对十位、百位进行比较,直到余数为0时,说明已经比较完成。
二 问题 B: 反序数
题目描述
设N是一个四位数,它的9倍恰好是其反序数(例如:1234的反序数是4321)
求N的值
输入
程序无任何输入数据。
输出
输出题目要求的四位数,如果结果有多组,则每组结果之间以回车隔开。
分析:
直接通过取余以及求商来对数进行处理
代码:
#include<cstdio>
int main(){
for(int n=1000;n<10000;n++){
int i=n%10*1000+n/10%10*100+n/100%10*10+n/1000;
if(i==9*n)
printf("%d\n",n);
}
}
3.问题 E: 众数
题目描述
输入20个数,每个数都在1-10之间,求1-10中的众数(众数就是出现次数最多的数,如果存在一样多次数的众数,则输出权值较小的那一个)。
输入
测试数据有多组,每组输入20个1-10之间的数。
输出
对于每组输入,请输出1-10中的众数。
注意如果存在一样多次数的众数,则输出权值较小的那一个。
样例输入
8 9 6 4 6 3 10 4 7 4 2 9 1 6 5 6 2 2 3 8
样例输出
6
分析:
考虑使用散列,即将输入的数字存在对应数组中,用数组的值来存储该数的个数,然后比较大小,取出其中的最大值,注意当几个数的个数相同的时候,取出数值最小的那个数。
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int a[20];
int main(){
while(scanf("%d",&a[0]) !=EOF){
int b[20]={0};
b[a[0]]++;
for(int i=1;i<20;i++){
scanf("%d",&a[i]);
b[a[i]]++;
}
int max=b[0];
int c=0;;
for(int i=1;i<11;i++){
if(b[i]>max){
c=i;
max=b[i];
}
else if(max==b[i]) {
if(i<c)
c=i;
}
}
printf("%d\n",c);
}
}
思路:
b[a[i]]++即把某一个数的个数存储到数组中,用数组的下标表示该数,
else if(max==b[i]) {
if(i<c)
c=i;
}
上面的代码为,当两个数字的个数相同时,取出其中的小的数字
需要注意的是:由于要输入多组数据,因此每次都需要对存放数字个数的数组进行初始化,不然程序不对,下一次输入数据时,其个数是在上一次的基础上添加的。