c菜鸟刷题打怪升级,记一些题,以后忘了可以参考参考,若有大神给出厉害的解决方法,感激不尽。
题目来源:http://www.scut.edu.cn/oj/
- 输入一行数字,用空格分开,以Q或q字符作为结束标志,输出数字:
int main () {
int i=0,j;
int arr[100];
char flag;
printf("input numStr:");
do {
scanf("%d",&arr[i]);
flag = getchar();
i++;
}while( flag!='Q' && flag!='q');
for(j = 0; j < i-1; j++) {
printf("%d\t",arr[j]);
}
return 0;
}
- 输入一行数字,空格分开,回车结束,冒泡排序后输出,链表实现:
# include
#include
int main () {
char flag; //作为判断是否输入结束的标志
int tmp; //冒泡排序时交换数据暂时用的变量
struct Node {
int value;
struct Node* next;
};
struct Node* head=NULL; //头结点
struct Node* q = NULL;
struct Node* p = NULL;
head = (struct Node*)malloc( sizeof(struct Node) );//生成头结点
head->next = NULL;
printf("input numStr:");
//输入数据,生成链表
while(1){
p = (struct Node*)malloc( sizeof(struct Node) );
scanf("%d",&p->value);
flag =getchar();
p->next= head->next;
head->next = p;
if(flag=='\n'){
break;
}
}
//冒泡排序
for(p=head->next;p!=NULL;p=p->next){
for(q=p->next;q!=NULL;q=q->next){
if(p->value>q->value){
tmp = p->value;
p->value = q->value;
q->value = tmp;
}
}
}
//输出链表
p = head->next;
while(p!=NULL){
printf("%d\t",p->value);
p=p->next;
}
return 0;
}
- 求解一元二次方程:
# include
#include
#include
int main () {
double a,b,c,delta;
printf("input a,b,c:");
scanf("%lf",&a);
while(a==0){
printf("a cannot be 0:");
scanf("%lf",&a);
}
scanf("%lf %lf",&b,&c);
delta = b*b-4*a*c;
if(delta<0){
printf("无解");
}
else if(delta==0){
printf("x1=x2=%.2lf",(-b)/(2*a));
}
else {
printf("x1=%.2lf,x2=%.2lf",(-b+sqrt(delta))/(2*a),(-b-sqrt(delta))/(2*a));
}
printf("\n");
return 0;
}
- 有4个互不相同的数字,输出由其中三个不重复数字组成的排列。
# include
#include
#include
int main () {
int str[4];
int i,j,k;
for(i=0;i<4;i++){
scanf("%d",&str[i]);
}
for(i=0;i<4;i++){
for(j=0;j<4;j++){
for(k=0;k<4;k++){
if(k!=i&&k!=j&&i!=j){
printf("%d %d %d\n",str[i],str[j],str[k]);
}
}
}
}
return 0;
}
- 输出所有的"水仙花数".所谓"水仙花数"是指这样的一个三位数:其各位数字的立方和等于该数本身。例如:371是一个"水仙花数",371=33+73+1^3.
# include
#include
#include
int main () {
int num,tmp,sum,i;
for(num=100;num<1000;num++){
tmp = num;
sum = 0;
for(i=0;i<3;i++){
sum = sum+(tmp%10)*(tmp%10)*(tmp%10);
tmp = tmp/10;
}
if(sum == num) {
printf("%d\n",num);
}
}
return 0;
}
- 一个自然数被8除余1,所得的商被8除也余1,
再将第二次的商被8除后余7,最后得到一个商为a.
又知这上自然数被17除余4.所得的商被17除余15,
最的得到一个商是a的2倍.
求这个自然数.
int main () {
int x = 1993;
int a,b,c,d,e,f,g;
while(1){
a = x%8;//1
b = (x/8)%8;//1
c = (x/8)/8/8;//a
d = (x/8)/8%8;//7
e = x%17;//4
f = (x/17)%17;//15
g = (x/17)/17;//2a
//printf("%d %d %d %d %d %d %d\n",a,b,c,d,e,f,g);
if((a==1)&&(b==1)&&(d==7)&&(e==4)&&(f==15)&&(g==2*c))break;
x++;
}
printf("%d\n",x);
return 0;
}
- 两个不同的自然数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。3000以内的全部亲密数(输出格式:(A,B),不加换行,不加分隔符号) 一对亲密数只输出一次, 小的在前:
int main () {
int numA,numB=0;
int i,sum=0;
for(numA=1;numA<=3000;numA++){
sum=0;
numB=0;
for(i=1;inumA){
printf("(%d,%d)",numA,numB);
}
}
}
printf("\n");
return 0;
}
- 按递增顺序依次列出所有分母为40,分子小于40的最简分数。
# include
int main () {
int i,factor,j;
for(i=1;i<40;i++){
factor = 1;
for(j=1;j<=i;j++){
if(i%j==0&&40%j==0){
factor = j;
}
}
if(factor == 1){
printf("%d/40,",i);
}
}
printf("\n");
return 0;
}
- 某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件:
1)A和B两人中至少去一人;
2)A和D不能一起去;
3)A、E和F三人中要派两人去;
4)B和C都去或都不去;
5)C和D两人中去一个;
6)若D不去,则E也不去。
问应当让哪几个人去?
# include
# include
int main () {
int a,b,c,d,e,f;
int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0;
for(a=0;a<=1;a++){
for(b=0;b<=1;b++){
for(c=0;c<=1;c++){
for(d=0;d<=1;d++){
for(e=0;e<=1;e++){
for(f=0;f<=1;f++){
flag1 = a||b;
flag2 = (a==1&&d==0)||(a==0&&d==1);
flag3 = (a==1&&e==1&&f==0)||(a==1&&e==0&&f==1)||(a==0&&e==1&&f==1);
flag4 = (b==1&&c==1)||(b==0&&c==0);
flag5 = (c==1&&d==0)||(c==0&&d==1);
flag6 = (d==0&&e==0)||(d==1&&e==1)||(d==1&&e==0);
if(flag1&&flag2&&flag3&&flag4&&flag5&&flag6){
if(a==1)printf("A,");
if(b==1)printf("B,");
if(c==1)printf("C,");
if(d==1)printf("D,");
if(e==1)printf("E,");
if(f==1)printf("F,");
return 0;
}
}
}
}
}
}
}
return 0;
}
- 输出N个数的斐波那契数列
# include
# include
int main () {
int num[40]={1,1};
int i,len;
scanf("%d",&len);
for(i=2;i
- 输入若干个整数,以-1标记输入结束。输出其中的最大数
# include
# include
int main () {
int num[100],i,len=0,max;
scanf("%d",&num[0]);
max=num[0];
while(num[len]!=-1){
len++;
scanf("%d",&num[len]);
}
for(i=1;i<=len;i++){
if(num[i]>max){
max = num[i];
}
}
printf("%d\n",max);
return 0;
}
- 求1+2!+3!+...+N!的和(N<=20)
# include
# include
int multi (int num) {
int i,result=1;
for(i=1;i<=num;i++){
result = result*i;
}
return result;
}
int main () {
int num,i,result=0;
scanf("%d",&num);
for(i=1;i<=num;i++){
result = result+multi(i);
}
printf("%d\n",result);
return 0;
}
- 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个一位的整数。
例如2+22+222+2222+22222(此时共有5个数相加),整数a和n(n个数相加,1<= n, a<=9)
# include
# include
int main () {
int a,n,i,j,num=0,sum=0;
scanf("%d %d",&a,&n);
for(i=1;i<=n;i++){
num = 0;
for(j=0;j
- 求具有abcd=(ab+cd)2性质的四位数:
# include
# include
int main () {
int num,front,back;
for(num=1000;num<10000;num++){
front = num/100;
back = num%100;
if(pow((front+back),2.0) == num){
printf("%d ",num);
}
}
}
- 按如下递归公式求函数值。
x=1时 f(x)=10;x>1时 f(x)=f(x-1)+2.输入x输出f(x)的值
# include
int f(int x){
if(x==1) return 10;
if(x>1) return f(x-1)+2;
}
int main () {
int x;
scanf("%d",&x);
printf("%d\n",f(x));
return 0;
}
- 求矩阵的两对角线上的元素之和,输入:矩阵的行数N和一个N*N的整数矩阵a[N][N] (N<=10),输出:所输矩阵的两对角线上的元素之和:
# include
int main () {
int n,i,j,sum=0;
int arr[10][10];
scanf("%d",&n);
for(i=0;i
法二:利用矩阵对角线相加的规律:若N为奇数,则和为正对角线和乘以2再减去矩阵的最中间数arr[i][i](因为中间值被算了两次,所以要减掉);若N为偶数,则和为正对角线和乘以2.
# include
# include
int main () {
int n,i,j,sum=0;
int arr[10][10];
scanf("%d",&n);
for(i=0;i
- 求出1-N中的所有素数:
# include
# include
int main () {
int n,i,num,flag;
scanf("%d",&n);
for(num=2;num<=n;num++){
flag = 0;
for(i=2;i<=sqrt((double)num);i++){
if(num%i==0){
flag = 1;
break;
}
}
if(flag == 0){
printf("%d ",num);
}
}
return 0;
}
- 一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。两小时后里程表上出现了一个新的对称数。问该车的速度是多少?新的对称数是多少?
# include
int main () {
int num = 95859;
int shang,yu;
int arr[20],i,j,flag;
do{
num++;
shang = num;
i=0;
flag=0;
/*分解当前值,得到每一位,存入数组*/
do {
yu = shang%10;
shang = shang/10;
arr[i] = yu;
i++;
}while(shang!=0);
for(j=0;j