第二章------基础练习
1,求100-200以内的素数和
#include<stdio.h>
int main(){
int x=100;
while(x<200){
int i,isPrime=1;
for(i=2;i<x;i++){
if(x%i==0){
isPrime = 0;
break;
}
}
if(isPrime==1){
printf("%4d", x);
}
x++;
}
}
//函数实现100-200的素数
#include<stdio.h>
#include<math.h>
int happy(int n){
int i;
for (i = 2; i < n;i++){
if(n%i==0)
return 0;
}
return 1;
}
int main(){
int happy(int n);
int i;
for (i =100; i <200;i++){
if(happy(i)){
printf("%4d",i);
}
}
}
2,对输入的正整数,求它的约数和
#include<stdio.h>
int main(){
int i,j;//用于保存正整数
scanf("%d", &i);
int sum = 0;
for (j = 1; j <=i;j++){
if(i%j==0)
sum += j;
}
printf("%d", sum);
}
3,输出1000以内所有完数,格式为%d its factors are a,b,c;
(完数:整数=它的因子数之和,6=1+2+3)
#include<stdio.h>
int main(){
int n=1,i;
int sum=0;
int count = 0;
int factor[100];
while(n<1000){
int sum = 0,count=0;
for (i = 1; i <= (n / 2); i++)
{
if(n%i==0){
sum += i;
factor[count++] = i;
}
}
if(sum==n){
printf("%d its factors are ",n);
for (i = 0; i < count;i++)
printf("%d," ,factor[i]);
printf("\n");
}
n++;
}
}
4,将一个正整数分解质因数
(例如:90=2*3*3*5)
#include<stdio.h>
int main(){
int i,n;
printf("输入整数为:");
scanf("%d", &n);
for (i = 2; i < n;i++){
while(n%i==0){
printf("%d", i);
n /= i;
printf("*");
}
}
printf("%d\n", n);
}
5,计算n是否为完全平方数
(完全平方数:一个整数=另一个整数的平方)
#include<stdio.h>
#include<math.h>
int isSquare(int n){
int i;
if(n==1||n==0)
return 1;
i = sqrt(n);
if(i*i==n)
return 1;
else
return 0;
}
int main(){
int n;
scanf("%d", &n);
if(isSquare(n)!=0)
printf("%d是平方数", n);
}
6,输出三位整数中,既是完全平方数,又有两位数字相同的数
#include<stdio.h>
#include<math.h>
int isSquare(int n){
int i;
if(n==1||n==0)
return 1;
i = sqrt(n);
if(i*i==n)
return 1;
else
return 0;
}
int main(){
int a, b, c;
int num = 1;
while(num<1000){
if(isSquare(num)){
a = num % 10;
b = (num %100) /10;
c = num / 100;
if(a==b||b==c||c==a){
printf("%4d", num);
}
}
num++;
}
}
7,输出符合条件的整数:
加上100是完全平方数,加上168仍为完全平方数
#include<math.h>
int isSquare(int n){
int i;
if(n==1||n==0)
return 1;
i = sqrt(n);
if(i*i==n)
return 1;
else
return 0;
}
int main(){
int num = 1;//默认是10000以内,可自行输入
while(num<9999){
if(isSquare(num+100)&&(isSquare(num+168))){
printf("%4d", num);
}
num++;
}
}
8,M是任一整数,求立方小于m的最大整数,egM=10,2*2*2=8<10;
#include<stdio.h>
int main(){
int m, i=1;
scanf("%d", &m);
while(i *i *i < m){
i++;
}
printf("%d", --i);
}
9,函数实现任意两值的最大公约数(辗转相除)
#include<stdio.h>
int Prime(int a,int b){
int temp;//交换数值
while(b!=0){
temp = a % b;
a = b;
b = temp;
}
if(a==1)
return 1;
else
return 0;
}
int main(){
int a,b,n;
scanf("%d,%d", &a, &b);
n = Prime(a, b);
if(n==1){
printf("两数互为质数");}
}
10,输出前20组的素数对(或者100以内的素数对)
#include<stdio.h>
#include<math.h>
int isprime(int n){
if(n==1||n==0)//判边值
return 0;
for (int i = 2; i < sqrt(n);i++){
if(n%i==0)
return 0;
return 1;
}
}
int main(){
int num = 3;
int count = 20;
while(count){
if(isprime(num)&&isprime(num+2)){
printf("(%d,%d)", num, num + 2);
count--;
}
num+=2;
}
}
11.5,给出年月日计算时第几天
//忘了借鉴的哪位大佬,
#include<stdio.h>
int isleap(int year){
if((year%4==0&&year%100==0)||year%400!=0){//判平年闰年
return 1;
}else{
return 0;
}
}
int main(){
int year,month,day,count=0,i;
int month1[13]={0,31,28,31,30,31,31,30,31,31,30,31};//设数组表示天数
scanf("%d,%d,%d",&year,&month,&day);
if(isleap(year)){
month1[2]+=1;
}
for(i=1;i<month;i++){
count+=month1[i];
count+=day;//计算是该年的第几天
printf("%d",count);
}
}
12,实现复数加法和复数运算
#include<stdio.h>
int main(){
int a1,b1,a2,b2,p,q,e,f; //p记录实数,q记录复数部
printf("请输入复数:");
scanf("%d,%d,%d,%d",&a1,&b1,&a2,&b2);
p=a1+a2;//加法
q=b1+b2;
e=a1*a2-b1*b2;//乘法
f=a1*b2+a2*b1;
printf("相加得%d+%di\n",p,q);
printf("相乘得%d+%di\n",e,f);
return 0;
}
13,有1,2,3,4四位数字,能组成多少个互不相同且无重复的三位数?(几位数就几层for,我觉得嵌套太多了……不过水平很垃圾目前没想好如何优化)
#include<stdio.h>
int main(){
int i, j, k,count=0; // count用于统计个数
printf("\n");
for (i = 1; i < 5;i++){
for (j = 1; j < 5;j++){
for (k = 1; k < 5;k++){
if (i != k&&i!=j&&j!=k){
printf("%d%d%d ", i, j, k);
count++;
}
}
}
}
printf("%d", count);
}
14,函数实现三个整数xyz由小到大输出
//三个数字由小到大输出---用函数比较快
#include<stdio.h>
void sort(int *a, int l){
int i,v;//v用于交换
for (i = 0; i < l - 1; i++){//l-1
if (a[i] > a[i+1]){
v = a[i];
a[i] = a[i+1];
a[i+1] = v;
}
}
}
int main(){
int a[3],i;
printf("请输入三个整数:");
for (i = 0; i < 3; i++){
scanf("%d", &a[i]);
}
sort(a, 3);
for (i = 0; i < 3;i++)
printf("%d", a[i]);
}
15,输出9*9乘法口诀
#include<stdio.h>
int main(){
int i, j;
for (i = 1; i <9;i++){
for (j = 1; j < i;j++){
printf("%d*%d=%d ", i, j, i * j);
}
printf("\n");
}
}
16,输出1!+2!+3!……20!的和(注意数值范围)
#include<stdio.h>
int main(){
int i;
double sum=0,max=1;
for (i = 1; i <= 20;i++){
max *= i;
sum += max;
}
printf("%.2f ", sum);
}
17,判断两个数是否友好(也就是亲密数,判a的约数和是否等于b的约数和,不包括数字本身)
#include <stdio.h>
int QMS(int x)
{
int fact= 1;
for (int i = 2; i < x; i++){
if (x%i == 0){
fact += i;
}
}
return fact;
}
int main()
{
int m = 0,n = 0;
printf("Input m, n:\n");
scanf("%d,%d",&m,&n);
if (QMS(m) == n&&QMS(n) == m)
{
printf("是亲密数\n");
}else{
printf("不是亲密数\n");
}
}
18,(输出指定范围内的亲密数——摘自明天再学习博主)
#include<stdio.h>
int main()
{
int i,j,n;
scanf("%d",&n);
for(i=1;i<n;i++){
int sum1=0,sum2=0;
for(j=1;j<i;j++){
if(i%j==0)
sum1+=j;
}
for(j=1;j<sum1;j++){
if(sum1%j==0)
sum2+=j;
}
if(sum1<i&&sum2==i)
printf("%d<__>%d\n",sum1,i);
}
}
第三章------拆数问题
1,输出所有水仙花数,以三位数为例(水仙花数:其各位数字的立方和等于该数本身)
#include<stdio.h>
int main(){
int i = 100;
int a, b, c;
for (i = 100; i < 1000;i++){
a = i % 10;
b = (i / 10) % 10;
c = i / 100;
if(a*a*a+b*b*b+c*c*c==i)
printf("%4d", i);
}
}
2,输入正整数N,N=r1*r2*r3……rn,计算r1!+r2!+r3!……rn!(r1=百位,以此类推,个人感觉改成求构成该数因子的阶乘比较有意思,比如90=2*3*3*5,求2,2,3,5的阶乘)
#include<stdio.h>
int jc(int x){
int data=1,i=1;
for (i = 1; i <= x;i++){
data=data*i;//累乘
}
if (x>=1)//判1
return data;
else
return 0;
}
int main(){
int sum=0,num,k;
scanf("%d",&num);
while(num!=0){
k=num%10;
sum+=jc(k);
num=num/10;
}
printf("计算结果为%d", sum);
return 0;
}
3,判断输入正整数的位数(eg:13输出为2,3044输出为4,函数也比较好实现)
#include<stdio.h>
int main(){
int num, count = 0;
scanf("%d", &num);
while(num!=0){
num = num / 10;
count += 1;
}
printf("%d", count);
}
4,//计算Sn=a+aa+aaa+aaaa+aaaaa,n表示a的位数,a是一个数字
(注意这里不是计算从1到n个a连乘的和)
#include<stdio.h>
int main(){
int num, sum = 0,i=1,s=0;//num做记录基本数字
int n;//输入n的个数
scanf("%d%d", &num,&n);
for (i = 1; i <= n;i++){
s = s + num;
sum += s;
num = num * 10;
}
printf("%d", sum);
}
5,将整数m的各位保存到数组A中(这个题给出的算法思路看的我有点迷糊,故根据自己理解结合大神代码做了新的解释)
#include<stdio.h>
int recursion(int* arr, int num) {
//判定递归的尾部,返回0到上一层,正好赋arr[0]的值
if (num == 0)
return 0;
int index = recursion(arr, num / 10) ;
arr[index] = num % 10;//赋当前num值的个位数
return index+1;
}
int main() {
int num;
scanf("%d", &num);
int arr[10] = {0};
int len = recursion(arr, num);//返回的值刚好是num的长度
for (int i = 0; i < len; i++) {//遍历这个数组。
printf("%d ", arr[i]);
}
return 0;
}
6,输入正整数,输出该数各个位数的和(原答案有数组,感觉有些多余)
#include<stdio.h>
int main(){
int num;
scanf("%d", &num);
int sum=0;
while(num!=0){
sum += num % 10;
num = num / 10;
}
printf("%d", sum);
}
7,判断给定整数是否由1、3、7、9组成
#include<stdio.h>
int main(){
int m, n, flag = 1;//flag做判定条件
scanf("%d", &n);
while(n!=0){
m = n % 10;
n /= 10;
if(!(m==1||m==3||m==7||m==9)){
flag = 0;
break;
}
}
if(flag)
printf("YES!");
else
printf("No");
}
8,输出一个数的反序数(个位是百位,百位是各位)
#include<stdio.h>
int main(){
int num;
int n,sum=0;
scanf("%d", &num);
while(num!=0){
n = num % 10;
num /= 10;
sum = sum * 10 + n;
}
printf("%d", sum);
}
9,字符串逆序,将字符串abc反转为cba(两个指针会更快)
#include<stdio.h>
#include<string.h>
void reverse(char* s, int sSize){
int start = 0;
int end = sSize - 1;
char t = 0; //中间变量用做交换
if(sSize == 0 || sSize == 1)// 判断字符串长度如果是0或1,则反转后的字符串为本身
s = s;
// 字符串对调
while(start < end){
t = s[start];
s[start] = s[end];
s[end] = t;
++start;
--end;
}
printf("反转后的字符串为:%s\r\n", s);
}
int main()
{
int len = 0;
char s[10] = {0};
printf("请输入字符串:");
gets(s);
//scanf("%s", s);
len = strlen(s);
//printf("字符串为:%s, 字符串长度为%d\r\n", s, len);
reverse(s, len);
return 0;
}
10,判断一个数是否为回文数(回文数也称逆序数,形如12321,13431,个位与最高位同,以此类推,感觉用累加的方式相比挨个取值要快。)
#include<stdio.h>
int main(){
int num,m,n;
int sum=0;
scanf("%d", &num);
n=num;
while(num!=0){
m = num % 10;
num /= 10;
sum = sum * 10 + m;
}
if(sum==n)
printf("是回文数");
else
printf("不是回文数");
}
11,整数文法定义
#include<stdio.h>
int main(){
int i, N = 0;
char str[100];
scanf("%s", str);
for (i = 0; str[i] != '\0';i++){
if(str[i]>='0'&&str[i]<='9'){
N = str[i] - '0' + N * 10;
}else{
printf("error\n");
break;
}
}
if(str[i]=='\0')
printf("%d\n", N);
return 0;
}
12,算法,对两个正整数输入,求结果(123*45=1*4+1*5+2*4+2*5+2*4+3*5=54),分别相乘
(debug和run出结果不一致,目前没发现问题在哪。)
int main(){
int a, b, sum;
int len1=0,len2=0;
printf("请输入两整数:");
scanf("%d,%d", &a,&b);
int num1[10] = {0};
int num2[10] = {0};
while(a!=0){
num1[len1++] = a % 10;
a /= 10;
}
while(b!=0){
num2[len2++] = b % 10;
b /= 10;
}
for (int i = 0; i < len1;i++)
for (int j = 0; j <len2;j++){
sum += num1[i] * num2[j];
}
printf("%d", sum);
}
13,给数字加密,输入四位数,每位数字分别+5,在用/10的余数代替,交换14,23位置的数字,输出极为加密后的数据
注意边界值!!
#include<stdio.h>
void exchange(int *a, int *b){
int t;
t = *a;
*a = *b;
*b = t;
}
int main(){
int a[4], n, i;
scanf("%d", &n);
while(n<1000||n>9999){
printf("该数不合要求,请重新输入:\n");
scanf("%d",&n);
continue;
}
for (i = 0; i < 4;i++){
a[i] = ((n % 10) + 5) % 10;
n = n / 10;
}
exchange(&a[0], &a[3]);
exchange(&a[1], &a[2]);
for (i = 3; i >=0;i--){
printf("%d", a[i]);
}
}
14,对于自然数,是偶数则除2,是奇数则*3+1,有限次运算后可得到1,计算运算次数
(书上例题是输入22,step=16,我个人运行是15)
int main(){
int a, step=0;
scanf("%d", &a);
while(a!=1){
if(a%2==0){
a /= 2;
step++;
}else{
a = a * 3 + 1;
step++;
}
}
printf("%d", step);
}
第四章-----数据集合与进制
1,集合M定义如下,整数1属于M,如果n属于M,则y=2*n+1;z=3*n+1也属于M,再没有别的数属于M。有点懵逼
#include<stdio.h>
int a[200];
void insert(int k){
int i;
for (i = 0; i < 200;i++)//集合有这个元素,直接返回
if(a[i]==k)
return;
for (i = 199; i >= 0;i--){//往后挨个对比
if(a[i]==0)
continue;
if(k<a[i])
a[i + 1] = a[i];//数组元素后移
else{
a[i + 1] = k;//插入
return;
}
}
}
int main(){
int count = 0, i, y, z,n;
a[0] = 1;
for (i = 0; i < 200;i++){
n = a[i];
printf("%4d", a[i]);
count++;
y = 2 * n + 1;
z = 3 * n + 1;
insert(y);
insert(z);
if(count==100)
break;
}
return 0;
}
2,对任意输出的整数n,打印出集合{0,1,……n-1}的子集
代码摘自UUTK(http://t.csdn.cn/xB0vd)
#include<stdio.h>
#include<math.h>
int main(){
int n;
printf("请输入n的值:");
scanf("%d",&n);
int m=pow(2,n);
for(int i=0;i<m;i++){
int B[n];
int t=0;
int tmp=i;//转二进制
while (tmp != 0){
B[t] = tmp % 2;
t++;
tmp/= 2;
}
printf("{");
int flag=0; //flag用来控制逗号的输出
for(int j=0;j<n;j++){
if(B[j]==1){
if(flag==0){
printf("%d",j);
flag=1;
}else{
printf(",%d",j);
}
}
}
printf("} ");
}
return 0;
}
3,16进制转10进制
#include<stdio.h>
#include<string.h>
#define N 10
int fun(char array[]){
int i, sum = 0;
for (i = 0; i < strlen(array);i++){
if(array[i]>='0'&&array[i]<='9')
sum = sum * 16 + array[i] - '0';
else if(array[i]>='A'&&array[i]<='F')
sum = sum * 16 + array[i] - 'A' + 10;
else if(array[i]>='a'&&array[i]<='f')
sum = sum * 16 + array[i] - 'a' + 10;//16进制不区分abc大小写,判小写
else
break;
}
return sum;
}
int main(){
char array[N];
gets(array);
printf("%d", fun(array));//调用函数
return 0;
}
4,十进制转二进制输出(书上代码会多一个0)
#include<stdio.h>
void dectobin(int n) {
int sum = 0;
int y, x = 1;
while (n != 0) {
y = n % 2;
sum = x * y + sum;
x *= 10;
n /= 2;
}
printf("%d", sum);
}
int main(){
int n;//输入一个十进制整数
scanf("%d", &n);
dectobin(n);
}
5,计算二进制的和,注意边界值(代码摘自http://t.csdn.cn/cr033)
#include<stdio.h>
void add(int a[],int n)
{
int i=n-1;
while(a[i]==1){//所有连续的1,变成0,遇到的第一个0,变成1
a[i]=0;
i--;
}
if(i!=-1){//判断位数是否需要增加
a[i]=1;
}else{
for(int i=1;i<=n;i++){//数组内元素全为1,加一需增加一位
a[i]=0;
}
a[0]=1;//进位首元素为1
n++;//数组长度+1
}
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
}
int main()
{
int a[5]={1,1,1,1};
add(a,4);
return 0;
}
8,不同进制的非负整数转换,输入a,n,b,将a进制的n转为b进制,输出字母符号时全大写
(08年北大机试题)
#include<stdio.h>
#include<string.h>
int main(){
int a,b;
char str[40];
while(scanf("%d%s%d",&a,str,&b)!=EOF){
int tmp = 0,c=1;
int len=strlen(str);
for(int i=len-1;i>=0;i--){//从低位到高位遍历每个数位上的数
int x;//计算该位上数字
if(str[i]>='0' && str[i]<='9'){
x = str[i]-'0';
}else if(str[i]>='a' && str[i]<='z'){
x = str[i]-'a'+10;
}else{
x = str[i]-'A'+10;
}
tmp+=x*c;
c*=a; //求出这个十进制数
}
char ans[50];
int cnt= 0;
do{
int x = tmp % b; //计算该位数字
ans[cnt++]=(x<10)? x : x-10+'A';
tmp/=b;
}while(tmp);
for(int i= cnt-1;i>=0;i--)
printf("%c",ans[i]);
printf("\n");
}
return 0;
}
9,输出由0,1组成的字符序列,以"*"作为结束标志,输出对应的十进制数(其实就是二转十啦,不考虑溢出,用函数比较快)
#include<stdio.h>
#include<math.h>
#define N 100
int convert(char *str){
char s;
int i,len,result=0;
len = strlen(str);
for(i=0;(s=str[i])!='*';i++)
if(s=='1')
result += pow(2,len-2-i);
return result;
}
int main(){
char str[N];
printf("请输入二进制数,以*结束:");
gets(str);
int result = convert(str);
printf("相应的十进制为:%d\n",result);
}
10,十进制转八进制(目前没发现自己写的问题在哪)
#include<stdio.h>
int main(){
int a;
printf("请输入需要转换的数:");
scanf("%d", &a);
int b[10] = {0};//数组用于记录除8的余数
int count = 0;//记录数位
while(a!=0){
b[count++] = a % 8;
a /= 8;
}
for (count=count-1; count>= 0;count--)
printf("%d", b[count]);
}
//书上原代码
#include<stdio.h>
int main(){
int a;
printf("请输入需要转换的数:");
scanf("%d", &a);
int b[10] = {0};//数组用于记录除8的余数
int count = 0;//记录数位
while(a/8!=0){
b[count++] = a % 8;
a /= 8;
}
b[count] = a;
while (count != 0){
printf("%d", b[count--]);
}
printf("%d", b[0]);
}
第五章------数组
1,编写函数实现N*M矩阵中的最大值和平均值
void get_stats(int array[][COLS], int rows, int cols, int* max, float* avg) {
int sum = 0;
*max = array[0][0];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (array[i][j] > *max) {
*max = array[i][j];
}
sum += array[i][j];
}
}
*avg = (float) sum / (rows * cols);
}
int main() {
int array[ROWS][COLS] = {
{5, 8, 3, 4},
{2, 6, 7, 1},
{9, 4, 6, 2}
};
int max_val;
float avg_val;
get_stats(array, ROWS, COLS, &max_val, &avg_val);//要取地址,才能存值
printf("最大值:%d\n", max_val);
printf("平均值:%f\n", avg_val);
return 0;
2,编写函数,将数组A分为左右部分,其中左为奇数,右为偶数
#include<stdio.h>
void separate(int arr[], int len) {
int left = 0, right = len - 1;
while (left < right) {
while (left < right && arr[left] % 2 != 0) {
left++;
}
while (left < right && arr[right] % 2 == 0) {
right--;
}
if (left < right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
int main(){
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int n = 10;
separate(a, 10);
for (int i = 0; i < 10;i++)
{
printf("%4d", a[i]);
}}
3,给定m*n矩阵,编写函数将矩阵逆置
#include <stdio.h>
#define ROWS 3
#define COLS 4
int main() {
int matrix[ROWS][COLS] = {{00, 01, 02, 03},
{10, 11, 12, 13},
{20, 21, 22, 23},};
printf("Original matrix:\n");
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
//核心交换代码
for (int i = 0; i < ROWS / 2; i++) {
for (int j = 0; j < COLS; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[ROWS - 1 - i][COLS - 1 - j];
matrix[ROWS - 1 - i][COLS - 1 - j] = temp;
}
}
printf("Modified matrix:\n");
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
4,AB合并成有序数组C
#include<stdio.h>
void merge(int A[], int m, int B[], int n, int C[]) {
int i = 0, j = 0, k = 0;
while (i < m && j < n) {
if (A[i] < B[j]) {
C[k++] = A[i++];
} else {
C[k++] = B[j++];
}
}
// 将剩余的元素加入C中
while (i < m) {
C[k++] = A[i++];
}
while (j < n) {
C[k++] = B[j++];
}
}
5,编写函数,将数组的偶数从小到大放到数组前半部分,奇数有序放在后半部分
#include<stdio.h>
#define N 7
void sort(int a[],int m,int n){
int t;
for (int i = m; i < n - 1;i++)
for (int j = m; j < n - 1-i;j++){
if(a[j]>a[j+1]){
t = a[j + 1];
a[j + 1] = a[j];
a[j] = t;
}
}
}
int main(){
int a[N] = {1, 4, 3, 2, 5, 9, 7};
int i = 0, j = N - 1, temp, p = 0, q = 0;//用于交换奇偶
while(i<j){
while(a[i]%2==0){
i++;
p++;//用于统计偶数的个数
}
while(a[j]%2!=0){
j--;
q++;//统计奇数的个数
}
if(i<j){
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
sort(a, 0, p - 1);
sort(a, p, p + q - 1);
for (i = 0; i < N;i++)
printf("%d", a[i]);
}
6,编写函数将两向量的位置互换
#include<stdio.h>
#define N 6
#define M 5
void reverse(int a[],int n){
int i, temp;
for (i = 0; i < n / 2;i++){
temp = a[i];
a[i] = a[n - 1 - i];
a[n - 1 - i] = temp;
}
}
int main(){
int i;
int a[M + N];
for (i = 0; i < M + N;i++)
scanf("%d", &a[i]);
reverse(a, M + N);//整个逆置
reverse(a, N);//前半部分逆置
reverse(a + N, M);//后半部分逆置
for (i = 0; i < M + N;i++)
printf("%d", a[i]);
}
7,15个数放从大到小在数组中,输入一个数用折半查找该数是第几个元素值
#include <stdio.h>
#define N 15
int binarySearch(int arr[], int low, int high, int key)
int main() {
int arr[N] = {99, 88, 77, 66, 55, 44, 33, 22, 21, 20, 19, 18, 17, 16, 15}; // 已经排好序的数组
int key, index; // 要查找的数和其下标
printf("请输入要查找的数:");
scanf("%d", &key);
index = binarySearch(arr, 0, N - 1, key);
if (index == -1) {
printf("该数不存在!");
} else {
printf("该数是第%d个元素的值。\n", index + 1);
}
return 0;
}
int binarySearch(int arr[], int low, int high, int key) {
while (low <= high) {
int mid = (low + high) / 2; // 求中间位置
if (key == arr[mid]) { // 找到
return mid;
} else if (key > arr[mid]) { // 在左半边继续查找
high = mid - 1;
} else { // 在右半边继续查找
low = mid + 1;
}
}
return -1; // 没找到
}
8,输入一组数字,求由改组数字组成的最大整数
#include<stdio.h>
int main(){
int i, j, k=0, temp, n,a[10],ne=0;
scanf("%d", &n);
while(n!=0){//各位元素存入数组
a[k] = n % 10;
n /= 10;
k++;
}
for (i = 0; i < k;i++)//交换大小元素
for (j = k - 1; j > i;j--){
if(a[j]>a[j-1]){
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
for (i = 0; i < k;i++)
ne = ne * 10 + a[i];
printf("%d", ne);
}
9,输入字符串,判断字符串是否包含大小写字母,数字三类字符中的两类
#include<stdio.h>
#include<string.h>
int main(){
char c;//存储字符串
//gets(s);
int flag1=0, flag2=0,flag3=0;//用于记录大小写字母
printf("请输入字符串\n");
while((c=getchar())!='\n'){
if(c>='a'&&c<='z')
flag1=1;
else if(c>='A'&&c<='Z')
flag2=1;
else if(c >= '0' && c <= '9')
flag3=1;
else;
}
flag1 = flag1 + flag2 + flag3;
if(flag1>=2)
printf("包含两种字符;");
else
printf("----");
}
10,数组逆序输出
#include<stdio.h>
#define N 10
int main(){
int a[N] = {1, 2, 4, 7, 6, 9, 3, 2, 5, 10};
int i=0, j=N-1;
for (i = 0; i < N/2;i++,j--){
int temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
for (i = 0; i < N;i++)
printf("%d ", a[i]);
}
11,对数组全体进行向右移动,输出数组。(感觉这题很有意思,可能是因为我一直没弄明白)
#include<stdio.h>
#include<stdlib.h>
void print_arr(int array[],int n){//打印数组
int i;
for (i = 0; i < n;++i)
printf("% d", array[i]);
printf("\n");
}
void move(int array[],int n,int offset){//滚动数组
int *p, *arr_end,last;
arr_end = array + n;//数组最后一个元素的下一个位置
while(offset){//直到偏移量为0
last = *(arr_end - 1);
for (p = arr_end - 1; p != array; --p)//向右滚动移位
*p = *(p - 1);
*array = last;
--offset;
}
}
int main(){
int arr[20], i, n, offset;
printf("Total numbers?\n");//输入数组大小和数组内容
scanf("%d", &n);
for (i = 0; i < n;i++)
scanf("%d", &arr[i]);
printf("set your offset.\n");//输入滚动偏移量
scanf("%d", &offset);
print_arr(arr, n);//打印滚动前的数组
move(arr, n, offset);//滚动数组并打印
print_arr(arr, n);
}
12,函数计算字符串长度。
#include<stdio.h>
int fun(char *str){
int i = 0;
while(*str!='\0'){
i++;
str++;
}
return i;
}
int main(){
char str[20],len;
gets(str);
len = fun(str);
printf("字符串长度为:%d",len);
}
13,此题感觉就一半,不全,缺条件
14,假设包含m个元素的整型数组a,该数组存放m个不重复的整数,编写函数求数组中第k大的数,其中m>=1,i<=k<=m
#include <stdio.h>
// 冒泡排序算法(快排也可)
void bubble_sort(int a[], int m)
{
int i, j, temp;
for (i = 0; i < m - 1; i++){
for (j = 0; j < m - i - 1; j++){
if (a[j] > a[j + 1]){
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}
// 求数组中第k大的数
int find_kth_largest(int a[], int m, int k)
{
bubble_sort(a, m);
return a[m - k];
}
int main()
{
int a[] = {5, 2, 9, 3, 7, 1, 8, 6, 4};
int m = sizeof(a) / sizeof(a[0]);
int k;
scanf("%d", &k);
printf("原数组:");
for (int i = 0; i < m; i++)
printf("%d ", a[i]);
printf("\n");
int kth_largest = find_kth_largest(a, m, k);
printf("第%d大的数为:%d\n", k, kth_largest);
return 0;
}