//2089
/*思路:不吉利的数字为所有含有4或62(连号)的号码。
例如:62315 73418 88914
都属于不吉利号码.
*/
#include<stdio.h>
#include<string.h>
#define N 10
int dp[N][N];//dp[i][t],i代表位数,t代表首位为t
int main()
{
for (int i = 0; i <= 9; i++)
{
dp[1][i] = 1;
}
for (int i = 2; i <= 7; i++)
{
for (int t = 0; t <= 9; t++)
{
for (int k = 0; k <= 9; k++)
{
if (t == 4 || k == 4)
{
continue;
}
if (t!=6||k!=2)
{
dp[i][t] += dp[i - 1][k];
}
}
}
}
int l, r;
while (~scanf("%d%d",&l,&r))
{
if (l==0&&r==0)
{
break;
}
int d1[10];
int d2[10];
memset(d1, 0, sizeof(d1));
memset(d2, 0, sizeof(d2));
int len1 = 1;
int len2 = 1;
while (l>0)
{
d1[len1] = l % 10;
l /= 10;
len1++;
}
while (r>0)
{
d2[len2] = r % 10;
r /= 10;
len2++;
}
int sum1 = 0;
int sum2 = 0;
for (int i = len1-1 ; i >= 1; i--)
{
for (int t = 0; t < d1[i]; t++)
{
if ((t==2&&d1[i+1]==6)||t==4)
{
continue;
}
sum1 += dp[i][t];
}
if (d1[i]==4||(d1[i+1]*10+d1[i])==62)
{
break;
}
}
for (int i = len2-1; i >= 0; i--)
{
for (int t = 0; t < d2[i]; t++)
{
if ((t == 2&&d2[i+1]==6)||t==4)
{
continue;
}
sum1 += dp[i][t];
}
if (i == 1 && d2[i] != 4 && (d2[i + 1] * 10 + d2[i]) != 62)
sum2++;
if (d2[i] == 4 || (d2[i + 1] * 10 + d2[i]) == 62)
break;
}
printf("%d
", sum2 - sum1);
}
return 0;
}
//2090
//思想:菜价=数量乘上单价,然后相加
#include<stdio.h>
#include<string.h>
#define N 100
int main()
{
char str[N];
double amount;
double price;
double sum = 0;
while (scanf("%s%lf%lf",str,&amount,&price)!=EOF)
{
sum += amount*price;
}
printf("%.1lf
", sum);
return 0;
}
//2091
/*思路:主要是找规律,
主要思路就是找出行数和A所在未知的规律,比如不是首尾行的,根据行号确定字母的位置,比如是在非首尾行的第i行,该行有n-i个空格,那么该行的第一个字母就是在第n-i+1的位置上,中间再输出2*i-1个空格(空格就是在两个字母之间,),接着再输出字母,
接着换行到下一行,直到最后一行 ,最后一行是2*n-1
比如测试案例是7和A,第一行是先输出6个空格,再根据i的大小输出‘A’或者空格;
第二行是先输出5个空格,再根据再输出‘A’,
*/
#include<stdio.h>
#include<string.h>
int main()
{
char c;
int i, j, k;
int n;
int flag = 1;
//整数n表示等腰三角形的高,也就是输出图形的行数
while (~scanf("%c%d", &c, &n))
{
getchar();
if (c != '@')
{
if (flag != 1)
{
printf("
");
}
flag++;//用来计数是第几行
//第一行,先输出n-1个空格
for (i = 1; i <= n - 1; i++)
{
//printf(" ");
for ( j = n-i-1; j >= 0; j--)
{
printf(" ");
}
//假如是第二行,两个字母的位置分别是1和3,此时i是2
for ( k = 1; k <= 2 * i - 1 ; k++)
{
if (k == 1 || k == 2 * i - 1)
{
printf("%c", c);
}
else
{
printf(" ");
}
}
printf("
");
}
//最后一行,共有2*n-1个
for (i = 1; i <= 2 * n - 1; i++)
{
printf("%c", c);
}
printf("
");
}
else
{
break;
}
}
return 0;
}
//2092
#include<stdio.h>
int main()
{
int n, m;//n是和,m是乘积
int i;
while (~scanf("%d%d",&n,&m))
{
if (n==0&&m==0)
{
break;
}
for (i = -9999; i < 10000; i++)
{
int k = n - i;
if (k*i==m)
{
printf("Yes
");
break;
}
}
if (i>=10000)
{
printf("No
");
}
}
return 0;
}
//2093
/*思路:每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数,
但到现在还没有AC,正数表示AC所耗的时间,如果整数a跟上一对括号,里面有个整数b,那就表示该学生提交该题AC了,
耗去了时间a,同时曾经错误提交了b次
*/
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int cmp(const void *a,const void *b);
typedef struct people{
char name[15];
int time;
int num;
}people;
people peo1[1010];
int main(){
int n,m,num,time,num1,i,a,b;
char name[15];
num1=0;
scanf("%d%d",&n,&m);
while(~scanf("%s",&name)){
num=time=0;
for(i=0;i<n;i++){
if(scanf("%d(%d)",&a,&b)==2){
num++;
time+=(a+b*m);
}
else{
if(a>0){
num++;
time+=a;
}
}
}
strcpy(peo1[num1].name,name);
peo1[num1].time=time;
peo1[num1].num=num;
num1++;
}
qsort(peo1,num1,sizeof(people),cmp);
for(i=0;i<num1;i++){
printf("%-10s %2d %4d
",peo1[i].name,peo1[i].num,peo1[i].time);
}
return 0;
}
int cmp(const void *a,const void *b){
people *p = (people*)a,*q=(people *)b;
if(p->num!=q->num) return q->num-p->num;
if(p->time!=q->time) return p->time-q->time;
return strcmp(p->name,q->name);
}
//2094
//思路:所有人减去失败者的人数如果等于一则说明有成功者。
#include<iostream>
#include<set>
#include<string>
using namespace std;
int main()
{
set<string> all;
set<string> lose;
int T;
while (cin>>T&&T)
{
string a, b;
while (T--)
{
cin >> a >> b;
all.insert(a);
all.insert(b);
lose.insert(b);
}
if (all.size()-lose.size()==1)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
all.clear();
lose.clear();
}
return 0;
}
//2095
//思路:出现次数为奇数的数字;一直异或,留下的是奇数的数
#include<iostream>
using namespace std;
int main()
{
int T, res, n;
while (~scanf("%d",&T))
{
if (T == 0)
break;
res = 0;
for (int i = 0; i < T; i++)
{
scanf("%d", &n);
res ^= n;
}
printf("%d
",res);
}
return 0;
}
//2096
//思路:不管是几位数,就是将末尾两位数进行相加,相加后的结果也是保留计算结果的两位数
#include<stdio.h>
int main()
{
int T;
int a, b;
int sum;
scanf("%d", &T);
while (T--)
{
sum = 0;
scanf("%d%d", &a, &b);
a %= 100;
b %= 100;
sum = (a + b) % 100;
printf("%d
", sum);
}
return 0;
}
//2097
//思路:四位数转换为四位数字,返回四位数字的和,即是进制转换问题
#include<stdio.h>
//进制转换
int fun(int n, int mod)
{
int sum = 0;
while (n)
{
sum += n % mod;
n /= mod;
}
return sum;
}
int main()
{
int n;
int sum = 0;
while (~scanf("%d",&n))
{
if (n==0)
{
break;
}
sum = fun(n, 10);//注意这里别漏掉,22是十进制的各位数相加得到
if ((fun(n, 10) == sum)&&(fun(n, 12) == sum)&&(fun(n, 16) == sum))
{
printf("%d is a Sky Number.
", n);
}
else
{
printf("%d is not a Sky Number.
", n);
}
}
return 0;
}
//2098
/*思路:将一个偶数拆成两个不同的素数的和,问有几种拆法;
看1-n有几个素数将其记录在数组中,抽取数组中的两个素数,看其是否等于n,如果等于n,则count++*/
#include<stdio.h>
#include<math.h>
#define N 10000
int prime[N];//用来记录1-n中的素数
int isPrime(int n)
{
int i;
for (i = 2; i <= sqrt(double(n)); i++)
{
if (n%i==0)
{
break;
}
}
//一直都没有break,说明一直都没有因数
if (i>sqrt(double(n)))
{
return 1;
}
return 0;
}
int main()
{
int n;
int count;
int len = 0;
int flag;
for (int i = 2; i <= 10000; i++)
{
//如果i是素数,则将其放到素数数组中
if (isPrime(i))
{
prime[len++] = i;
}
}
while (~scanf("%d",&n))
{
count = 0;
if (n==0)
{
break;
}
flag = 0;//用来标记遍历当前素数的值和 n的大小,如果比n-1都要大的话,则不用继续遍历了
//遍历数值大小在2-10000中的素数数组,如果其中两个素数相加等于n,则count++
for (int i = 0; i < len; i++)
{
if (prime[i] < n-1)
{
for (int j = i + 1; j < len; j++)
{
if (prime[j] < n - 1)
{
if (prime[i] + prime[j] == n)
{
count++;
}
}
}
}
//如果prime[i]都已经大于等于n-1了,则prime[j]肯定大于等于n-1了,就直接break就好了,后面不会有符合条件的素数对了
else
{
break;
}
}
printf("%d
", count);
}
return 0;
}
//2099
#include<stdio.h>
int main()
{
int a, b;
while (~scanf("%d%d",&a,&b))
{
if (a == 0 && b == 0)
{
break;
}
int count = 0;//用来看是否是第一个数,便于控制空格
a *= 100;
for (int i = 0; i < 100; i++)
{
if ((a+i)%b==0)
{
count++;
if (count>1)
{
printf(" ");
}
printf("%02d", i);
}
}
printf("
");
}
return 0;
}