#include <stdio.h>
//1.实现一个对整型数组的冒泡排序
//int main()
//{
// int arr[10] = { 2,3,1,5,7,4,6,9,8,10 };
// int len = sizeof(arr)/sizeof(arr[0]);
// printf("%d\n", len);
// int i = 0;
// int j = 0;
// int flase = 0;
// for (i = 0; i < len - 1; i++)
// {
// for(j=0;j<len-1-i;j++)
// {
// if (arr[j] > arr[j + 1])
// {
// flase = 1;//交换了
// int tmp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = tmp;
// }
// }
// if (flase == 0)
// {
// break;
// }
//
// }
// for (i = 0; i < len; i++)
// {
// printf("%d ", arr[i]);
// }
// return 0;
//}
//2.创建一个整形数组完成对数组的操作
//1.实现函数int()初始化数组为全0
//2.实现printf() 打印数组的每个元素
//3.实现reverse()函数完成数组元素的逆置
//要求:自己设计以上函数的参数,返回值
//void InitArr(int arr[10],int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// arr[i] = 0;
// }
//}
//void Print(int arr[10], int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", arr[i]);
// }
//}
//void reverse(int arr[10],int sz)//二分法查找
//{
// int left = 0;
// int right = sz - 1;
// while (left < right)
// {
// int tmp = arr[left];
// arr[left] = arr[right];
// arr[right] = tmp;
// left++;
// right--;
// }
//}
//int main()
//{
// int i = 0;
// int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// //初始化数组
InitArr(arr,sz);
// //打印函数数组
// Print(arr,sz);
// printf("\n");
// //逆置--大小顺序倒转
// reverse(arr,sz);
// Print(arr, sz);
// return 0;
//}
//3.将数组A中的内容和数组B中的内容进行交换 (数组一样大)
//int main()
//{
// int arr1[] = { 1,3,5,7,9 };
// int arr2[] = { 2,4,6,8,0 };
// int i = 0;
// int tmp = 0;
// int sz = sizeof(arr1) / sizeof(arr1[0]);
// for (i = 0; i < sz ; i++)
// {
// tmp = arr1[i];
// arr1[i] = arr2[i];
// arr2[i] = tmp;
// }
// for (i = 0; i < sz ; i++)
// {
// printf("%d ", arr1[i]);
// }
// printf("\n");
// for (i = 0; i < sz ; i++)
// {
// printf("%d ", arr2[i]);
// }
// return 0;
//}
//4.int main()
//{
// int arr[] = { 1,2,3,4,5 };//4个字节
// short* p = (short*)arr;//2个字节
// int i = 0;
// for (i = 0; i < 4; i++)
// {
// *(p + i) = 0;
// }
// for (i = 0; i < 5; i++)
// {
// printf("%d ", arr[i]);//00345
// }
// return 0;
//}
//int main()
//{
// int a = 0X11223344;
// char* pc = (char*)&a;
// *pc = 0;
// printf("%x\n", a);//11223300
// return 0;
//}
//5.int i;//全局变量-不初始化-默认是0
//int main()
//{
// i--;//-1转变成无符号数--非常大
// if (i > sizeof(i))//sizeof()-计算变量/类型所占内存的大小->=0-是无符号数
// {
// printf(">\n");//>
// }
// else
// {
// printf("<\n");
// }
// return 0;
//
//}
//6.
//int main()
//{
// int a, b, c;
// a = 5;
// c = ++a;//c=6a=6
// b = ++c, c++, ++a, a++;//c=8,a=8,b =7
// b += a++ + c;//b=b + a++ + c //7+8+8=23//a=9c=8
// printf("a=%d b=%d c=%d\n:", a, b, c);//9 23 8
// return 0;
//}
//7.统计二进制中1的个数
//写一个函数返回参数二进制中1的个数
//int count_bit_one(unsigned int a)//排查负数的符号位
//{
// //参考123求每一位数123%10/10
// //a=13--00000000000000000000000000001101
// int count = 0;
// while (a)
// {
// if (a % 2 == 1)
// {
// count++;
// }
// a = a / 2;
// }
// return count;
//}
//int count_bit_one (int a)
//{
// int count = 0;
// int i = 0;
// for (i = 0; i < 32; i++)
// {
// if (((a >> i) & 1) == 1)
// {
// count++;
// }
// }
// return count;
//}
//最精简的方法
//int count_bit_one(int a)
//{
// int count = 0;
// while (a)
// {
// /*
// * a=13
// * 1101
// * 1100--12
// * 1100--a
// * 1011--11
// * 1000--a
// * 0111--7
// * 0000--a
// */
// a = a & (a - 1);
// count++;
// }
// return count;
//}
//int main()
//{
// int a = 0;
// scanf_s("%d", &a);
// int num = count_bit_one(a);
// printf("num = %d\n",num);
// return 0;
//}
//8.求二进制中不同位的个数
//两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
//int count_bit_diff(int m, int n)
//{
// int count = 0;
// while (m)
// {
// if ((m % 2) != (n % 2))
// {
// //m = m / 2;
// //n = n / 2;
// count++;
// }
// m = m / 2;//9,4
// n = n / 2;//11,5
// }
// return count;
//}
//int count_bit_diff(int m, int n)
//{
// int i = 0;
// int tmp = 0;
// int count = 0;
// tmp = m ^ n;
// //printf("%d\n", tmp);
// while (tmp)
// {
// tmp = tmp & (tmp - 1);
// count++;
// }
// return count;
//}
//int main()
//{
// int m = 0;//10011
// int n = 0;//10110//00101
// scanf_s("%d%d", &m,&n);
// int count = count_bit_diff(m, n);
// printf("%d\n", count);
// return 0;
//}
//9.打印二进制的奇数位和偶数位
//获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
//void get_bit(int n)
//{
// int i = 0;
// printf("奇数位:>\n");
// for (i = 30; i >= 0; i-=2)
// {
// printf("%d ", (n >> i) & 1);
// }
// printf("\n偶数位:>\n");
// for (i = 31; i >= 1; i -= 2)
// {
// printf("%d ", (n >> i) & 1);
// }
//
//}
//int main()
//{
// int n = 0;
// scanf_s("%d", &n);//10 00000000000000000000000000001010
// get_bit(n);
// return 0;
//}
//10.不创建临时变量,交换两个整数的内容
//int main()
//{
// int a = 10;
// int b = 20;
// //01010
// //10100
// //11110--a
// //10100
// //01010--b
// //11110--a
// //10100--b
// /*a = a ^ b;
// b = a ^ b;
// a = a ^ b;*/
// a = a + b;//30=a
// b = a - b;//20=b
// a = a - b;//10=a
// printf("a=%d\n", a);
// printf("b=%d\n", b);
// return 0;
//}
//11.写一个函数打印arr数组的内容,不使用数组下标,使用指针.arr是一个整型一维数组
//void DisplayArr(int* p ,int sz)
//{
// int i = 0;
// for (i = 0; i < sz; i++)
// {
// printf("%d ", *(p + i));
// }
//}
//int main()
//{
// int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// DisplayArr(&arr,sz);
// return 0;
//
//}
//12.实现一个函数,打印乘法口诀表.口诀表的行数和列数自己指定
//如:输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表
//void Print(int n)
//{
// int i = 0;
// int j = 0;
// for (i = 1; i <= n; i++)
// {
// for (j = 1; j <= i; j++)
// {
// printf("%d * %d = %-3d ", i, j, i * j);
// }
// printf("\n");
// }
//}
//int main()
//{
// int n = 0;
// scanf_s("%d", &n);
// Print(n);
// return 0;
//}
//13.字符串逆序(递归实现)
//编写一个函数reverse_string(char* string)(递归实现)
//实现:将参数字符串中的字符反向排列
//要求:不能使用c函数库中的字符串操作函数
//#include <string.h>
//int my_strlen(char* str)
//{
// int count = 0;
// while (*str != '\0')
// {
// count++;
// str--;
// }
// return count;
//}
//void reverse_string(char string[])
//{
// int left = 0;
// int right = my_strlen(string) ;
// while (left<right)
// {
// int tmp = string[left];
// string[left] = string[right];
// string[right] = tmp;
// left++;
// right--;
// //reverse_string(string);
// }
//
//}
//递归方法
//void reverse_string(char* string[])
//{
// char tmp = string[0];
// int len = my_strlen(string);
// string[0] = string[len - 1];
// string[len - 1] = '\0';
// if ((my_strlen(string + 1) >= 2))
// {
// reverse_string(string + 1);
// }
// string[len - 1] = tmp;
//}
//int main()
//{
// char string[] = "abcdef";
// reverse_string(string);
// printf("%s\n", string);
// return 0;
//}
//14.计算一个数的每一位之和(递归实现)
//写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
//例如:调用DisitSum(1729),则应该返回1+7+2+9,它的和是19
//输入:1729 ,输出:19
//int DisitSum(unsigned int n)
//{
// if (n > 9)
// {
// return DisitSum(n / 10) + n % 10;
// }
// else
// {
// return n;
// }
//}
//int main()
//{
// unsigned int n = 0;
// scanf_s("%d", &n);
// int sum = DisitSum(n);
// printf("sum = %d\n", sum);
// return 0;
//}
//15.递归实现n的k次方
//编写一个函数实现n的k次方,使用递归实现
//double Pow (int n, int k)
//{
// if(k>0)
// {
// return n * Pow(n, k - 1);
// }
// else if (k == 0)
// {
// return 1;
// }
// else
// {
// return (1.0 / (Pow(n, -k)));
// }
//}
//int main()
//{
// int k = 0;
// int n = 0;
// scanf_s("%d%d ", &n,&k);
// double ret = Pow(n, k);
// printf(" ret = %lf\n ", ret);
// return 0;
//}
//16.求出0-100000之间的所有"水仙花数"并输出
//"水仙花数"是指一个n位数,其各位数字的n次方之和刚好等于该数本身,如135 = 1^3+5^3+3^3;,则135是一个"水仙花数"
#include <math.h>//pow函数的头文件 1235
int main()
{
int num = 0;
int a=0, b=0, c=0, d=0,e=0;
for (num = 0; num <= 99999; num++)
{
//个位:
a = (((num % 10000) % 1000) % 100) % 10;
//十位:
b = (((num % 10000) % 1000) % 100) / 10;
//百位:
c = ((num % 10000) % 1000) / 100;
//千位
d =( num %10000)/1000;
//万位
e = num / 10000;
if (num >= 0 && num <= 9)
{
printf("%d ", num);
}
else if (num >= 10 && num <= 99)
{
if (num == pow(a, 2.0) + pow(b, 2.0))
{
printf("%d ", num);
}
}
else if (num >= 100 && num <= 999)
{
if (num == pow(a, 3.0) + pow(b, 3.0) + pow(c, 3.0))
{
printf("%d ", num);
}
}
else if (num >= 1000 && num <= 9999)
{
if (num == pow(a, 4.0) + pow(b, 4.0) + pow(c, 4.0) + pow(d, 4.0))
{
printf("%d ", num);
}
}
else
{
if (num == pow(a, 5.0) + pow(b, 5.0) + pow(c, 5.0) + pow(d, 5.0) + pow(e, 5.0))
{
printf("%d ", num);
}
}
}
return 0;
}