C语言简单小算法(第一篇)

十道简单算法题

1、1-n阶乘之和
2、获取二维数组每列最小的值
3、求"1!+4!(2的平方)+9!(3的平方)+…+n的值
4、数组对角线元素之和
5、打印杨辉三角形
6、猴子吃桃子问题
7、计算单词的个数
8、判断字母是否完全一样
9、判断一个数是不是2的某次方
10、判断一个数字是不是ugly number

一、1-n阶乘之和

1-n阶乘之和怎么算?

1的阶乘是1
2的阶乘是12
3的阶乘是1
23
4的阶乘是1
234
………

现在我们要求这些阶乘的和。思路:
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]);
		}
		
      

 }

三、求"1!+4!(2的平方)+9!(3的平方)+…+n的值

思路:先求平方,后求阶乘,最后相加即可~

 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的某次方

思路:

除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");

            }
        }
    }

你可能感兴趣的:(数据结构与算法)