颠倒的号码牌
题目:
小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店。其标价都是4位数字(即千元不等)。小李为了标价清晰、方便,使用了预制的类似数码管的标价签,只要用颜色笔涂数字就可以了。
这种价牌有个特点,对一些数字,倒过来看也是合理的数字。如:1 2 5 6 8 9 0 都可以。这样一来,如果牌子挂倒了,有可能完全变成了另一个价格,比如:1958 倒着挂就是:8561,差了几千元啊!! 当然,多数情况不能倒读,比如,1110 就不能倒过来,因为0不能作为开始数字。 有一天,悲剧终于发生了。某个店员不小心把店里的某两个价格牌给挂倒了。并且这两个价格牌的电视机都卖出去了! 庆幸的是价格出入不大,其中一个价牌赔了2百多,另一个价牌却赚了8百多,综合起来,反而多赚了558元。 请根据这些信息计算:赔钱的那个价牌正确的价格应该是多少?
答案是一个4位的整数,请通过浏览器直接提交该数字。
#include<stdio.h>
#include<math.h>
int main(){
int num1[7]={0,1,2,5,6,8,9},num2[7]={0,1,2,5,9,8,6};//因为6要变成9,9要变成6,所以定义两个数组,6 9位置颠倒
int a,b,c,d,i,j,k,m;
int p1,p3,diff1,p2,diff2;//p1,p3表示赔二百的,p2表示挣八百的
for(a=1;a<7;a++){
for(b=0;b<7;b++){
for(c=0;c<7;c++){
for(d=1;d<7;d++){
p1=num1[a]*1000+num1[b]*100+num1[c]*10+num1[d];
p3=num2[d]*1000+num2[c]*100+num2[b]*10+num2[a];
diff1=fabs(p1-p3);
if(diff1>200&&diff1<300){
for(i=1;i<7;i++){
for(j=0;j<7;j++){
for(k=0;k<7;k++){
for(m=1;m<7;m++){
p2=num1[i]*1000+num1[j]*100+num1[k]*10+num1[m];
diff2=fabs(p2-(num2[m]*1000+num2[k]*100+num2[j]*10+num2[i]));
if(diff2>800&&diff2<900&&fabs(diff1-diff2)==558){
if(p1<p3){
printf("%5d",p3);
return 0;
}else{
printf("%5d",p1);
return 0;
}
}
}
}
}
}
}
}
}
}
}
return 0;
}
最多约数问题
题目:
最多约数问题。正整数 x 的约数是能整除x的正整数,其约数的个数记为div(x),例如div(10)=4。设 a 和 b 是两个正整数,找出 a 和 b 之间约数个数最多的数 x 的约数个数。
样例输入: 1 36
样例输出: 9
#include<stdio.h>
int main(){
int a,b;//输入的a和b
int num,maxnum=2;//maxnum表示x约数的个数,num表示计算过程中某个是的约数个数
int i,j;
scanf("%d%d",&a,&b); //input a and b
for(i=b;i>=a;i--){ //从大到小遍历
if(i%2==0){ //约数最多的一定是偶数
num=2; //1和i是固有的约数,所以num起始值为2
for(j=2;j<=i/2;j++){ //j代表一个约数
if(i%j==0){
if(j==i/j){ //例如 36=6*6的情况
num++;
}else if(j<i/j){
num+=2;
}else{
break;
}
}
}
if(num>maxnum)
maxnum=num;
}
}
printf("%d",maxnum);
return 0;
}