2015.1.28
3.给定某个拥有 5 个元素的字符数组,数组的成员都有阿拉伯字符构成,试着将该数
//组转换成一个整数,比如字符数组的内容是:{‘1’,’2’,’3’,’3’,’2’} 则将被转换成 12332。
//处理整形数组
/*int main(int argc, const char * argv[]) {
int a[100];
int cnt=0;
int sum=0;
for (int i=0; i<100; i++) {
scanf("%d", &a[i]);
cnt++;
if (getchar()==‘\n‘) {
break;
}
}
for (int i=0; i<cnt; i++) {
sum = sum*10+a[i];
}
printf("sum = %d\n", sum);
return 0;
}*/
//处理字符数组
#if 0
int main(int argc, const char * argv[]) {
char ch[100];
int cnt=0;
int sum=0;
for (int i=0; i<100; i++) {
scanf("%c", &ch[i]);
if (ch[i]==‘\n‘) {
ch[i]=‘\0‘;
break;
}
cnt++;
}
for (int i=0; i<cnt; i++) {
sum = sum*10+(ch[i]-‘0‘);
}
printf("sum = %d\n", sum);
return 0;
}
#endif
//7.计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为
//1cm,数字宽度为 0.5cm、标点符号宽度为 0.8cm。
//8.接上题,如果规定行的宽度为 10cm,将某个字符长度超过 50 的字符串截断,恰好 使 10cm 宽的行能容纳。输出这个被截断的子数组。
#include <string.h>
float judgeChar(char ch)
{
if ((ch>=‘A‘&&ch<=‘Z‘) || (ch>=‘a‘&&ch<=‘z‘)) {
return 1.0;
}
else if(ch>=‘0‘ && ch <= ‘9‘)
{
return 0.5;
}
else
{
return 0.8;
}
}
#if 0
int main(int argc, const char *argv[])
{
char str[100];
float sum =0.00;
scanf("%s", str);
int len = (int)strlen(str);//求字符串有效字符个数,不包含‘\0‘;
for (int i=0; i<len; i++) {
sum+=judgeChar(str[i]);
}
printf("sum = %.2f\n", sum);
return 0;
}
#endif
#if 0
int main(int argc,const char *argv[])
{
char str[100];
scanf("%s",str);
int len = (int)strlen(str);
float sum =0;
for (int i=0; i<len; i++) {
sum+=judgeChar(str[i]);
if (sum>10) {
str[i]=‘\0‘;
break;
}
if (sum==10) {
str[i+1]=‘\0‘;
break;
}
}
printf("str = %s\n", str);
return 0;
}
#endif
//给定一个整型数组,数组的长度为 N(N>3),从数组中寻找一个连续的长度为 3 的子数组,要求该子数组的和最大。
#if 0
int main(int argc, const char *argv[])
{
int a[100];
int cnt=0;
for (int i=0; i<100; i++) {
scanf("%d", &a[i]);
cnt++;
if (getchar()==‘\n‘) {
break;
}
}
int max = a[0]+a[1]+a[2];
for (int i=1; i<cnt-2; i++) {
if (max<a[i]+a[i+1]+a[i+2]) {
max = a[i]+a[i+1]+a[i+2];
}
}
printf("max = %d\n", max);
return 0;
}
#endif
//41.编写函数将一个n*n矩阵转置,例如:(****)
//1 2 3 4 1 5 3 4
//5 6 7 8 -> 2 6 2 7
//3 2 5 9 3 7 5 2
//4 7 2 3 4 8 9 3
//void reverseArr(int *a[], int n)
//{
//
// return 0;
//}
#if 0
int main(int argc,const char *argv[])
{
int a[4][4]={{1,2,3,4},
{5,6,7,8},
{3,2,5,9},
{4,7,2,3}};
for (int i=0; i<4-1; i++) {
for (int j=i+1; j<4; j++) {
int temp = a[i][j];
a[i][j]=a[j][i];
a[j][i]=temp;
}
}
for (int i=0; i<4; i++) {
for (int j=0; j <4; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0 ;
}
#endif
//猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
#if 0
int main(int argc,const char *argv[])
{
int a[10]={};
a[9]=1;
for (int i=8; i>=0; i--) {
a[i]=(a[i+1]+1)*2;
}
printf("%d ", a[0]);
return 0;
}
#endif
//围圈报数
//有m个人围成一圈,顺序排号。从第一个人开始报数(从1到n报数),凡报到m的人退出圈子,问最后留下的是原来第几号的哪位。
//5 3 --> 4
//6 2 --> 5
//0 0 0 4 0
//
#if 0
int main(int argc, const char *argv[])
{
int a[100];
int m, n;
int cnt = 0;//统计退出的人数
scanf("%d %d", &m , &n);
if (m<1||m>100 || n<1) {
return -1;
}
int i=0;
for (i=0; i<m; i++) {//给数组赋值
a[i]=i+1;
}
int k=0;//报数
i = 0;
while (cnt<m-1) {
if(a[i])
{
k++;
if (k==n) {
a[i]=0;
k=0;
cnt++;
}
}
i++;
if (i==m) {//边界处理
i=0;
}
}
for (int i=0; i<m; i++) {
if (a[i]) {
printf("%d", i+1);
}
}
printf("\n");
return 0;
}
#endif
//3.输入十个数,任意相邻的两个数不同,输出所有的递增,递减序列
//比如:
//输入:1 5 9 8 12 21 3 0 -1 9
//输出:
//1 5 9
//9 8
//8 12 21
//21 3 0 -1
//-1 9
//
//输入: 3 9 8 -11 4 21 8 -3 0 2
//输出:
//3 9
//9 8 -11
//-11 4 21
//21 8 -3
//-3 0 2
#if 0
int main(int argc,const char *argv[])
{
int a[10]={};
for (int i=0; i<10; i++) {
scanf("%d", &a[i]);
}
printf("%d ", a[0]);
for (int i=1; i<9; i++) {
printf("%d ", a[i]);
if ((a[i]>a[i-1] && a[i]>a[i+1]) || (a[i]<a[i-1] && a[i]<a[i+1])) {
putchar(‘\n‘);
printf("%d ", a[i]);
}
}
printf("%d\n", a[9]);
return 0;
}
#endif
//2. 输入两个数,第一个数决定一个nXn的矩阵,第二个数决定从1开始赋值,赋值的上限
//比如:
//输入:5 18
//输出:
//1 2 3 4 5
//16 17 18 0 6
//15 0 0 0 7
//14 0 0 0 8
//13 12 11 10 9
//
//输入: 4 12
//输出:
//1 2 3 4
//12 0 0 5
//11 0 0 6
//10 9 8 7
#if 0
int main(int argc, const char *argv[])
{
int a[20][20]={};
int m,n;
scanf("%d%d", &n,&m);
if (n<1 || m>n*n|| m<0) {
return -1;
}
int s1=n-1, s2=n-1, s3=0, s4=1;//控制边界
int i=0,j=0;//控制二维数组下标
int type=1;//1:从左往右赋值, 2:从上往下赋值,3:从右往左赋值 4: 从下往上赋值
int cnt=1;//表示赋值的数
while (cnt<=m) {
a[i][j]=cnt;//赋值
switch (type) {
case 1://从左往右赋值
if (j==s1) {
type=2;
s1--;
i++;
}
else
{
j++;
}
break;
case 2://从上往下赋值
if (i==s2) {
type =3;
s2--;
j--;
}
else
{
i++;
}
break;
case 3://从右往左赋值
if (j==s3) {
type =4;
s3++;
i--;
}
else
{
j--;
}
break;
case 4://从下往上赋值
if (i==s4) {
type =1;
s4++;
j++;
}
else
{
i--;
}
break;
default:
break;
}
cnt++;
}
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
printf("%4d", a[i][j]);
}
printf("\n");
}
return 0;
}
#endif
//4..输入10个数,找出出现次数最多的数 (如果多个并列,则按数字出现顺序分别输出)
//比如:
//输入:1 2 2 3 2 5 5 7 8 9
//输出:2 5
// 1 3 0 1 0 2 0 1 1 1
// max =2;
// 2 5
//数据结构: 定义一个整型数组 int count[10] 存储每个元素的个数, 开始时每个元素个数初始化为1
//
//算法:
//(1) 利用双层循环, 每一个元素都与后面一个元素比较, 如果两者相同, 则该元素次数+1,
//(2) 以上的算法中两个相同的元素的次数是一样的, 优化如下, 比较两个元素的时候, 如果两者相等, 则该元素次数+1, 后面的元素次数设置为0, 比较的时候再判断这个元素是否已经比较
//
//伪代码:
//
//定义数组保存每个元素次数
//
//使用双层循环遍历数组
//如果当前元素后后面元素相等, 并且后面的元素次数不为0
//当前元素次数+1, 后面的元素次数设置为0
//
//从保存每个元素次数的数组中查找最大的值
#if 0
int main(int argc,const char *argv[])
{
int a[10]={};
int count[10];
for (int i=0; i<10; i++) {
scanf("%d", &a[i]);
}
for (int i=0; i<10; i++) {
count[i]=1;
}
for (int i=0; i<10; i++) {
if (count[i]) {
for (int j=i+1; j<10; j++) {
if (a[i]==a[j] && count[j]) {
count[i]++;
count[j]=0;
}
}
}
}
// for (int i=0; i<10; i++) {
// printf("%d ", count[i]);
// }
//查找count最大值
int max = count[0];
for (int i=1; i<10; i++) {
if (max<count[i]) {
max = count[i];
}
}
//输出出现最多次数的值
for (int i=0; i<10; i++) {
if (max == count[i]) {
printf("%d ", a[i]);
}
}
printf("\n");
return 0;
}
#endif
//5.魔方阵是一个古老的智力问题,它要求在一个m*m的矩阵中填入1~m^2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等。请编程实现输入m,输出m*m的魔方阵出来。
//比如:
//输入:3
//输出:
//6 1 8
//7 5 3
//2 9 4
//(1)将1放在第一行中间一列;
//(2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数减1(例如上面的三阶魔方阵,5在4的上一行后一列);
//(3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
//(4)当上一个数的列数为1时,下一个数的列数应为n,行数减去1。例如2在第3行 第一列,则3应放在第二行最后一列;
//(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
int main(int argc,const char *argv[])
{
int a[19][19]={};
int m;
scanf("%d", &m);
if (!(m%2) || m<3 ||m>19) {
return -1;
}
int i=0,j=m/2;
int cnt =1;
int temi,temj;
while (cnt<=m*m) {
a[i][j]=cnt;
temi = i;//保存上一个数的下标
temj = j;
i--;//变换下标
j--;
if(temi==0)//变换行标
{
i = m-1;
}
if (temj==0)//变换列标
{
j = m-1;
}
if(a[i][j])
{
i = temi+1;
j = temj;
}
cnt++;
}
for (int i=0; i<m; i++) {
for (int j=0; j<m; j++) {
printf("%4d", a[i][j]);
}
printf("\n");
}
return 0;
}