十道简单算法题
1、1-n阶乘之和
2、获取二维数组每列最小的值
3、求"1!+4!(2的平方)+9!(3的平方)+…+n的值
4、数组对角线元素之和
5、打印杨辉三角形
6、猴子吃桃子问题
7、计算单词的个数
8、判断字母是否完全一样
9、判断一个数是不是2的某次方
10、判断一个数字是不是ugly number
1-n阶乘之和怎么算?
1的阶乘是1
2的阶乘是12
3的阶乘是123
4的阶乘是1234
………
现在我们要求这些阶乘的和。思路:
3阶乘的和其实上就是2阶乘的和+3的阶乘
4阶乘的和其实上就是3阶乘的和+4的阶乘
int Factorial(int n)
{
//总和
int sum = 0;
//阶乘值,初始化为1
int num = 1;
int i = 0;
for ( i = 1; i <= n; i++)
{
num = num*i;
sum+=num;
}
return sum;
}
思路:遍历列,再遍历列中行
void minArray()
{
//二维数组
int arrays[][4] = {
{23, 106, 8, 234},
{25, 9, 73, 19},
{56, 25, 67, 137}
};
int arr[4];
int i,j;
int min = 0;
for(i = 0 ;i<4;i++)
{
min = arrays[0][i];
for(j = 1;j<3;j++)
{
if(arrays[j][i]<min)
{
min = arrays[j][i];
}
}
arr[i] = min;
}
for(i = 0;i<4;i++)
{
printf("%d\n",arr[i]);
}
}
思路:先求平方,后求阶乘,最后相加即可~
void calculate()
{
int sum = 0;
int i = 1;
int j = 1;
//1
for ( i = 1; i <= 2; i++)
{
//得到平方数
int square = i * i;
//阶乘值,从1开始
int factorial = 1;
//求阶乘
for ( j = 1; j <= square; j++)
{
factorial = factorial * j;
}
sum = sum + factorial;
}
printf("%d\n",sum);
}
思路:
只要行和列相等,即是对角线的元素
void arraySum()
{
//[0][0] [1][1] [2][2] [3][3] [0][3] [1][2] [2][1] [3][0]
int arrays[][4] =
{
{23, 106, 8, 234},
{25, 9, 73, 19},
{56, 25, 67, 137},
{33, 22, 11, 44},
};
//和
int sum = 0;
int i = 0;
int j = 0;
int row = (sizeof(arrays)/sizeof(int))/(sizeof(arrays[0])/sizeof(int))-1;
//printf("%d\n",row);
for ( i = 0; i < 4; i++)
{
sum += arrays[i][i+row]; //求出第一条对角线的元素和;
row-=2;
}
for(i = 0;i<4;i++) //第二条对角线
{
sum+=arrays[i][i];
}
printf("%d\n",sum);
}
规律:
每行的第一个和最后一个都是1
进一步推算:第1列全部为1,第一行全都是1,当列数等于行数为1
当前值等于头上的值加头上的左边的值
第一行一列,第二行两列,第三行三列…….
void fun()
{
int arr[6][6];
int i = 0;
int j = 0;
for(i = 0;i<6;i++)
{
arr[i][0] = 1;//
arr[i][i] = 1;//
}
for(i = 2;i<6;i++)
{
for(j = 1;j<=i-1;j++)
{
arr[i][j] = arr[i-1][j-1]+arr[i-1][j];
}
}
for(i = 0;i<6;i++)
{
for(j = 0;j<=i;j++)
{
printf("%3d",arr[i][j]);
}
printf("\n");
}
}
猴子摘下了n个桃子,当天吃掉一半多一个,第二天也是吃掉剩下桃子的一半多一个,到了第十天,桃子只剩下了1个。问:猴子第一天摘了多少个桃子
思路:
假设当天有n个桃子,它是前一天桃子的一半少1个,f(n - 1) = f(n)/2 - 1,
我们就可以推出当天桃子的个数:根据递推公式:f(n) = 2 * f(n - 1) + 2
递归方式:
int monkeyQue(int x)
{
if(x<=0)
{
return 0;
}
else if(x==1)
{
return 1;
}
else
{
return 2*monkeyQue(x-1)+2;
}
}
输入一段字符,计算出里面单词的个数,单词之间用空格隔开 ,一个空格隔开,就代表着一个单词了
int countWord(char * str)
{
// 空格次数
int num = 0;
int i = 0;
while(*str!='\0')
{
if(*str==' ')
{
num++;
}
str++;
}
return num+1;
}
给定两个字符串s和t,判断这两个字符串中的字母是不是完全一样(顺序可以不一样)
#include
using namespace std;
bool IsAnagram(char* str1, char* str2)
{
char hashtable[256] = { 0 };
char* cur1 = str1;
char* cur2 = str2;
int sz1 = strlen(str1);
int sz2 = strlen(str2);
if (sz1 != sz2)
return false;
while (*cur1 != '\0')
{
hashtable[*cur1]++;
++cur1;
}
while (*cur2 != '\0')
{
if (hashtable[*cur2] != 0)
{
hashtable[*cur2]--;
}
++cur2;
}
for (int i = 0; i < 256; i++)
{
if (hashtable[i] != 0)
return false;
}
return true;
}
int main()
{
char str1[] = "listenl";
char str2[] = "slientl";
char str3[] = "alient";
char str4[] = "evil";
char str5[] = "live";
char str6[] = "eil";
bool ret1 = IsAnagram(str1, str2);
bool ret2 = IsAnagram(str1, str3);
bool ret3 = IsAnagram(str4, str5);
bool ret4 = IsAnagram(str6, str5);
cout << ret1 << endl;
cout << ret2 << endl;
cout << ret3 << endl;
cout << ret4 << endl;
system("pause");
return 0;
}
判断一个数是不是2的某次方
思路:
除2取余数,直至余数不为0【针对2的倍数这种情况】,看是不是等于1就可以判断是不是2的某次方了
void isPowerOfTwo(int num)
{
if (num == 0)
{
printf("不是\n");
}
while (num % 2 == 0)
{
num = num / 2;
}
if (num == 1)
{
printf("是\n");
}
else
{
printf("不是\n");
}
}
void isPowerOfTwo1(int num)
{
if(num <= 0)
{
printf("不是\n");
}
else if(num == 1)
{
printf("是\n");
}
else
{
if( (num & (num-1) ) == 0)
{
printf("是\n");
}
else
{
printf("不是\n");
}
}
}
十、判断一个数字是不是ugly number
判断一个数字是不是ugly number(分解出来的质因数只有2、3、5这3个数字)
思路:
如果是由2,3,5组成的,那么这个数不断除以2,3,5,最后得出的是1,这个数就是纯粹用2,3,5组成的
跟之前判断该数是否2的某次方是一样的思路~
void isUgly(int num)
{
if (num <= 0)
{
printf("不是\n");
}
else
{
while (num % 2 == 0)
{
num = num / 2;
}
while (num % 3 == 0)
{
num = num / 3;
}
while (num % 5 == 0)
{
num = num / 5;
}
if (num == 1)
{
printf("是\n");
}
else
{
printf("不是\n");
}
}
}