PAT(1~5)
1001.卡拉兹(Callatz)猜想:
对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
#include<stdio.h>
int main()
{
int n,count = 0;
scanf("%d",&n);
while(n!=1)
{
if(n&1)
{
n = (3 * n + 1) >>1;
count++;
}
else
{
n = n >> 1;
count++;
}
}
printf("%d\n",count);
}
1002.读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
#include<stdio.h>
int main(){
int i,j;
char num;
int sum = 0,n,minus;
for(i = 0;i<100;i++){
scanf("%c",&num);
if(num>='0' && num<='9'){
sum += num - '0';
}else{
break;
}
}
if(sum>=100){
minus = 100;
j = 3;
}
else if(sum >=10){
minus = 10;
j = 2;
}
else{
minus = 1;
j = 1;
}
for(i=0;i<j;i++){
n = sum / minus;
switch(n){
case 1:printf("yi ");
break;
case 2:printf("er ");
break;
case 3:printf("san ");
break;
case 4:printf("si ");
break;
case 5:printf("wu ");
break;
case 6:printf("liu ");
break;
case 7:printf("qi ");
break;
case 8:printf("ba ");
break;
case 9:printf("jiu ");
break;
case 0:printf("ling ");
break;
}
sum = sum%minus;
minus = minus/10;
}
}
1003 我要通过!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
size_t n;
size_t i,j = 0,k = 0,a1 = 0,a2 = 0,a3 = 0;
char (*s)[100],*cmp = "PAT";
scanf("%d",&n);
s = calloc(n,100);
for(i = 0;i<n;i++){
scanf("%s",(s+i));
}
for(i = 0;i<n;i++){
while(*(*(s+i)+j)){
if(*(*(s+i)+j)=='A'||*(*(s+i)+j)=='P'&&k ==0||*(*(s+i)+j)=='T'&&k==2){
if(*(*(s+i)+j)==*(cmp+k)){
++k;
}
if(*(*(s+i)+j) == 'A' && k == 0){
++a1;
}else if(*(*(s+i)+j) == 'A' && k == 2){
++a2;
}else if(*(*(s+i)+j) == 'A' && k == 3){
++a3;
}
}else{
printf("NO\n");
break;
}
++j;
}
if(3 == k&&j == strlen(*(s+i))&&a1*a2==a3){
printf("YES\n");
}else if(j == strlen(*(s+i))&&k != 3){
printf("NO\n");
}else if(3 == k&&j == strlen(*(s+i))&&a1*a2!=a3){
printf("NO\n");
}
j = 0;
k = 0;
a1 = 0;
a2 = 0;
a3 = 0;
}
return 0;
}
1004 成绩排名
#include<stdio.h>
#include<stdlib.h>
typedef struct Stu{
char name[11];
char no[11];
int score;
}Stu;
void sStu(Stu *p,int n){
int i;
for(i = 0;i<n;i++){
scanf("%s %s %d",(p+i)->name,(p+i)->no,&(p+i)->score);
}
}
void pStu(Stu *p){
printf("%s %s\n",p->name,p->no);
return;
}
void cmp(Stu *p,int n){
int max = 0,min = 0,i = 0;
for(i = 0;i<n;i++){
if((p+max)->score<(p+i)->score){
max = i;
}
if((p+min)->score>(p+i)->score){
min = i;
}
}
pStu(p+max);
pStu(p+min);
}
int main(){
int n;
Stu *ps;
scanf("%d",&n);
ps = calloc(n,sizeof(Stu));
sStu(ps,n);
cmp(ps,n);
free(ps);
}
1005 继续(3n+1)猜想
#include<stdio.h>
int a[101] = {0};
void cnt(int n){
int m;
if(n%2==0){
m = n/2;
}else{
m = (3*n+1)/2;
}
while(m != 1){
if(m<100){
if(a[m]==0){
a[m] = 1;
}else{
break;
}
}
if(m%2==0){
m = m/2;
}else{
m = (3*m+1)/2;
}
}
}
void sort(int arr[],int n){
int i,j;
for(i = 1;i<n;i++){
for(j = i;j>0;j--){
if(arr[j]>arr[j-1]){
arr[j] ^= arr[j-1];
arr[j-1] ^= arr[j];
arr[j] ^= arr[j-1];
}else{
break;
}
}
}
}
int main(){
int i,n,arr[100],f[100] = {0},fc = 0;
scanf("%d",&n);
for(i =0;i<n;i++){
scanf("%d",&arr[i]);
}
for(i = 0;i<n;i++){
cnt(arr[i]);
}
for(i = 0;i<n;i++){
if(a[arr[i]] == 0){
f[fc] = arr[i];
++fc;
}
}
sort(f,fc);
for(i = 0;i<fc;i++){
printf("%d",f[i]);
if(i<fc-1){
printf(" ");
}
}
}
1006 换个格式输出整数
#include<stdio.h>
#include<stdlib.h>
int main(){
char *p;
int i = 0,c = 2;
p = calloc(3,sizeof(char));
scanf("%s",p);
if(*(p+1) == 0){
for(i = 0;i<*p-'0';i++){
printf("%c",i+'1');
}
}else if(*(p+2) == 0){
for(i = 0;i<*p-'0';i++){
printf("S");
}
for(i = 0;i<*(p+1)-'0';i++){
printf("%c",i+'1');
}
}else{
for(i = 0;i<*p-'0';i++){
printf("B");
}
for(i = 0;i<*(p+1)-'0';i++){
printf("S");
}
for(i = 0;i<*(p+2)-'0';i++){
printf("%c",i+'1');
}
}
}
1007 素数对猜想
#include<stdio.h>
#include<math.h>
int isPrime(int n){
int i;
for(i = 2;i<=sqrt(n);i++){
if(n%i == 0){
return 0;
}
}
return 1;
}
int main(){
int n,i,cnt = 2,c = 0;
scanf("%d",&n);
for(i=2;i<=n;i++){
if(isPrime(i)){
if(i-cnt == 2){
++c;
}
cnt = i;
}
}
printf("%d",c);
}