6、对N行N列二维数组的每一行排序,偶数行(0当作偶数)由小到大排序,奇数行由大到小排序
#include <stdio.h>
#define N 4 //宏定义N为4
void max_first( int *a, int len ) //定义max_first函数,将数组由大到小排序
{
int m = 0;
int n = 0;
int temp = 0;
for( m = 0; m < len; m++ )
{
for( n = 0; n < len - 1 - m; n++ )
{
if( a[n] <= a[n + 1] )
{
temp = a[n];
a[n] = a[n + 1];
a[n + 1] = temp;
} //利用冒泡排序法对数组中的元素由大到小排序,前面的数小于等于后面的数就交换
}
}
}
void min_first( int *a, int len ) //定义min_first函数,将数组由小到大排序
{
int m = 0;
int n = 0;
int temp = 0;
for( m = 0; m < len; m++ )
{
for( n = 0; n < len -1 - m; n++ )
{
if( a[n] >= a[n + 1] )
{
temp = a[n];
a[n] = a[n + 1];
a[n + 1] = temp;
} //利用冒泡排序法对数组中的元素由小到大排序,前面的数大于等于后面的数就交换
}
}
}
int main()
{
int a[N][N] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int i = 0;
int j = 0;
for( i = 0; i < N; i++ )
{
if( i % 2 != 0 )
{
max_first( a[i], N ); //当为奇数行时,调用max_first函数
}
else if( i % 2 ==0 )
{
min_first( a[i], N ); //当为偶数行时,调用min_first函数
}
}
for ( i = 0; i < N; i++ )
{
for( j = 0; j < N; j++ )
{
printf("%d\t",a[i][j]);
}
printf("\n"); //输出转换后的二维数组
}
return 0;
}
7、找出符合以下条件的Troitsky数,将该数的首位数字移动到末位数字之后得到的数是原数的整数倍
例如:将142857的首位数字1移动到末位之后得到的数是428571,而428571=3*142857,因此142857是Troitsky数
编程要求:
(1) 编写函数int Troitsky(long a[]),其功能是求出10000以内的所有Troitsky数,并将它们依次放入a指向的数组中,函数返回找到的Troitsky数的个数.
(2)编写main函数,调用Troitsky函数,将运行结果输出到屏幕。
#include <stdio.h>
#define N 10000 //宏定义N的值为10000
int Troitsky( long a[] )
{
int i = 0;
int j = 0;
int k = 0;
int temp = 0;
int high = 0;
int result = 0;
int count = 0;
for( i = 1; i <= N; i++ )
{
temp = i; //将i的值传给temp
k = 0; //让k清零
while( temp != 0 )
{
temp = temp / 10;
k++; //求出temp的位数
}
temp = i; //重新让temp等于i
for( j = 0; j < k - 1; j++ )
{
temp = temp / 10; //求出temp最高位上的数
}
high = temp; //求得的值传给high
for( j = 0; j < k - 1; j++ )
{
temp = temp * 10; //将最高位的数乘以其位上的单位值
}
result = ( i - temp ) * 10 + high; //i减去最高位乘以其位上的单位值得到剩下位的数值,乘以10加上最高位上的数值即得到首位数字移到末位数字后的数值
if( (result >= i) && (result % i == 0) )
{
a[count] = i;
count++; //如果得到的数值大于等于i,并且能整除i,符合条件,放入数组a中,并让count累计有几个符合条件的数
}
}
return count; //返回累计的count值
}
int main()
{
int i = 0;
int num = 0;
long a[N] = {0};
num = Troitsky(a); //调用Troitsky函数
printf("the number of Troitsky is :%d\n",num); //输出累计的符合条件的数的个数
for( i = 0; i < num; i++ )
{
printf("%ld\t",a[i]); //输出符合条件的数
if( (i + 1) % 10 == 0 )
{
printf("\n"); //用i来控制输出,10个一行
}
}
printf("\n");
return 0;
}
8、合并两个字符集合为一个新集合,每个字符串在新集合中仅出现一次,函数返回新集合中字符串。
如:
s1集合{“while”,”for”,”switch”,”if”,”continue”}
s2集合{“for”,”case”,”do”,”else”,”char”,”switch”}
运行结果:
#include <stdio.h>
#include <string.h>
int combine( char s1[5][10], char s2[6][10], char result[11][10] )
{
int i = 0;
int j = 0;
int k = 0;
int flag = 0;
for( i = 0; i < 5; i++ )
{
for( j = 0; j < 10; j++ )
{
result[k][j] = s1[i][j]; //把s1中的字符串传给result
}
k++; //用来累计result中有几个字符串
}
for( i = 0; i < 6; i++ )
{
flag = 1;
for( j = 0; j < 5; j++ )
{
if( (strcmp(*(s1 + j), *(s2 + i))) == 0 ) //比较s1中有无和这个字符串相同的字符串
{
flag = 0;
break; //有相同字符串让flag=0退出本次循环
}
}
if( flag != 0 )
{
for( j = 0; j < 10; j++ )
{
result[k][j] = s2[i][j]; //当flag不为0代表s1中无相同的字符串,可以传给result
}
k++; //累计result中有几个字符串
}
}
return k; //返回k的值
}
int main()
{
char s1[5][10] = {"while","for","switch","if","continue"};
char s2[6][10] = {"for","case","do","else","char","switch"};
char result[11][10] = {0};
int i = 0;
int num = 0;
num = combine( s1, s2, result ); //调用combine函数,并让num等于其返回值
for( i = 0; i < num; i++ )
{
printf("%s\t",result[i]); //输出合并后的字符串
}
printf("\n");
return 0;
}
9、找出7个默森尼数。法国数学家默森尼曾提出下列公式:Mp=2^p-1。当p是素数并且Mp也是素数时,称Mp为默森尼数,
例如,p=5,Mp=2^5-1=31,5和31都是素数,因此31是默森尼数;而Mp=2^11-1=2047,11是素数,2047不是素数,因此2047不是默森尼数.
#include <stdio.h>
int prime( int i ) //定义判断素数函数
{
int j = 2;
for( j = 2; j < i; j++ )
{
if( i % j == 0 )
{
return 0;
break;
} //如果输入的数能整除比它小的数,不是素数,返回0,退出本次循环
}
return 1; //不能整除比它小的数,是素数,返回1
}
int main()
{
int i = 0;
int j = 0;
int count = 0; //用count来来累计符合条件的数的个数
long temp = 1;
for( i = 2; count < 7; i++ ) //当count等于7时停止循环
{
temp = 1; //让temp等于1
for( j = 0; j < i; j++ )
{
temp = 2 * temp; //算出2^i的值
}
temp = temp - 1; //让temp等于Mp
if( (prime(i) == 1) && (prime(temp) == 1) ) //当i和temp都是素数时符合条件
{
count++; //count+1
printf("%d\t",temp); //输出temp的值
}
}
printf("\n");
return 0;
}
10、对一个二维数组中的数据排序,方法如下:
将整个数组中值最小的元素所在行调整为数组第一行,
将除第一行外的行中最小元素所在行调整为第2行,
将除第1,2行外的行中最小值元素所在行调整为第3行,以此类推
#include <stdio.h>
#define N 4
int find_min( int a[N][N], int i ) //定义find_min函数,作用为找到一行中最小的数,并把最小值放在第一个
{
int j = 0;
int temp = 0;
int min = a[i][0]; //假设第一个数为最小的数
for( j = 0; j < N; j++ )
{
if( min > a[i][j] )
{
min = a[i][j]; //如果min大于后面的某个数,让min等于这个数
temp = a[i][0];
a[i][0] = a[i][j];
a[i][j] = temp; //把这个数和第一个数互换
}
}
return min; //返回这一行中最小的数
}
int find_minline( int a[N][N], int line )
{
int i = 0;
int temp = 0;
int min = find_min( a, line ); //调用find_min函数,找到line这一行最小的数并赋给min
int minline = line;
for( i = line + 1; i < N; i++ )
{
temp = find_min( a, i ); //调用find_min函数,找到i这一行最小的数,并赋给temp
if( min > temp )
{
minline = i; //比较min和temp,如果min大于temp,表示剩余数中的最小数在i行
min = temp; //将temp的值赋给min
}
}
return minline; //返回剩余数中最小数所在的行数
}
void swap( int a[N][N], int line, int minline )
{
int i = 0;
int temp = 0;
for( i = 0; i < N; i++)
{
temp = a[line][i];
a[line][i] = a[minline][i];
a[minline][i] = temp;
} //交换line行和minline行中的数
}
void sort( int a[N][N] )
{
int i = 0;
int minline = 0;
for( i = 0; i < N - 1; i++ )
{
minline = find_minline( a, i ); //调用find_minline行,找到最小数所在的行数,并赋给minline
if( minline != i ) //如果minline不等于i,交换
{
swap( a, i, minline ); //调用swap函数,交换i行和minline行中的数
}
}
}
int main()
{
int a[N][N] = {{18,24,53,74},{5,66,37,81},{29,10,41,32},{13,64,85,56}};
int i = 0;
int j = 0;
printf("the original array :\n");
for( i = 0; i < N; i++)
{
for( j = 0; j < N; j++ )
{
printf("%d\t",a[i][j]); //输出交换前的二维数组
}
printf("\n");
}
sort( a ); //调用sort函数,对数组进行转换
printf("the array after sort:\n");
for( i = 0; i < N; i++)
{
for( j = 0; j < N; j++ )
{
printf("%d\t",a[i][j]); //输出交换后的二维数组
}
printf("\n");
}
return 0;
}