1.角谷猜想为:任给一个大于0的正整数N,按照如下规则(角谷变换)对其计算:
如果N为偶数,则将其除以2,即N/2;
如果N为奇数,则将其乘以3再加1,即3*N+1.
将得到的新数字不断重复上述变换规则,若干次后定可以得到 1。
请编写程序,输入一个大于0的正整数N,输出该数经过多少次角谷变
#include <stdio.h>
void getstep(int n) {
int count=0;
while(n!=1) {
if(n%2==0)
n/=2;
else
n=n*3+1;
count++;
}
printf("%d",count);
}
int main() {
getstep(22);
}
2.设有字符串S及长度为n的字符型维数组a,编写函数,统计a中每个字符在字符串s中出现的次数,要求该函数以s、a、n为形参,一维整型数组为返回值。
#include <stdio.h>
#include <stdlib.h>
int *getcount(char *s,char *a,int n) {
int *result=(int *)malloc(sizeof(int)*n);
int hash[255]= {0};
int i=0;
while(s[i]!='\0') {
hash[s[i]]++;
i++;
}
for(int i=0; i<n; i++) {
printf("%c : %d\n",a[i],hash[a[i]]);
result[i]=hash[a[i]];
}
return result;
}
3.编写程序,输入整数K (K>7),输出小于K且必须至少满足如下两个条件之一的所有正整数:
●该正整数是7的倍数;
●组成该正整数的数字中有7。
例如K=30,输出结果为: 7,14, 17, 21, 27, 28。
#include <stdio.h>
int have(int n) {
while(n!=0) {
if(n%10==7)
return 1;
n/=10;
}
return 0;
}
int judge(int n) {
for(int i=1; i<n; i++)
if(i%7==0||have(i))
printf("%d ",i);
}
int main() {
int n;
scanf("%d",&n);
judge(n);
}
4.设有m行n列(m,n>1)的整数构成的矩阵,编写程序将此矩阵中值小于等于0的元素所在的行和列上的所有元素置为0,并输出。
#include <stdio.h>
#include <stdlib.h>
void show(int **arr,int m,int n) {
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++)
printf("%5d",arr[i][j]);
printf("\n");
}
}
void makezero(int **arr,int m,int n,int locx,int locy) {
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if(i==locx||j==locy)
arr[i][j]=0;
}
int changezero(int **arr,int m,int n) {
int **list=(int **)malloc(sizeof(int *)*m);
for(int i=0; i<m; i++)
list[i]=(int *)malloc(sizeof(int)*n);
show(arr,m,n);
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
if(arr[i][j]<=0)
list[i][j]=0;
else
list[i][j]=1;
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
if(list[i][j]==0)
makezero(arr,m,n,i,j);
show(arr,m,n);
}
int main() {
int m=5,n=5;
int **arr=(int **)malloc(sizeof(int *)*m);
for(int i=0; i<m; i++)
arr[i]=(int *)malloc(sizeof(int)*n);
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
scanf("%d",&arr[i][j]);
changezero(arr,m,n);
}