int IsTheNumber(const int N) { int arr[10000]; if (sqrt(N) - (int)sqrt(N) == 0) { int i = 0, n = N; while (n != 0) { arr[i++] = n % 10; n /= 10; } for (int x = 0; x < i - 1; x++) { for (int j = x + 1; j < i; j++) { if (arr[x] == arr[j]) return 1; } } } return 0; }
首先我们要判断一个数是否为完全平方数,其次我们要判断这个数中是否有至少两个相同的数字,重点是第二个,我们可以用嵌套for循环遍历数组,时间复杂度为o(n^2),我们还可以将每个位上的数字作为数组下标,遇到一个下标就加加,最后看有没有至少一个下标中的元素大于等于2
int cmp_arr(const void* p1, const void* p2) { return (*(float*)p1 > *(float*)p2?1:-1); } ElementType Median(ElementType A[], int N) { qsort(A, N, sizeof(A[0]), cmp_arr); return A[N / 2]; }
这个用qsort函数可以很快解决,但有个需要注意的地方是,这里判断两个元素大小不能用作差法,因为当差小于1大于0时,返回值会约等于0,导致最后结果不准确
int prime( int p ) { int flag = 1; if(p<2) return 0; for(int i=2;i<=sqrt(p);i++) { if(p%i==0) { flag=0; return 0; } } if(flag) return 1; } int PrimeSum( int m, int n ) { int sum = 0; for(int i=m;i<=n;i++) { if(prime(i)) sum+=i; } return sum; }
int narcissistic( int number ) { int a=number, b=number, x=0, sum=0; while(b!=0) { b/=10; x++; } while(number!=0) { sum+=pow(number%10, x); number/=10; } if(sum == a) return 1; else return 0; } void PrintN( int m, int n ) { for(int i=m+1;i<n;i++) { if(narcissistic(i)) printf("%d\n",i); } }
int fib(int n) { int fib1 = 1, fib2 = 1, fib3 = 0; if (n <= 2) return 1; while (n > 2) { fib3 = fib1 + fib2; fib1 = fib2; fib2 = fib3; n--; } return fib3; } void PrintFN(int m, int n) { int flag = 1; for (int i = 1; i <= n + 1; i++) { if (fib(i) >= m && fib(i) <= n) { if (flag) { printf("%d", fib(i)); flag = 0; } else { printf(" %d", fib(i)); } } } if(flag) printf("No Fibonacci number"); }
void CountOff(int n, int m, int out[]) { int arr[1000], j = 0, count = 1; for (int i = 0; i < n; i++) { arr[i] = i + 1; out[i] = 0; } for (int i = 1; i <= n; i++) { if (arr[i - 1] == 0) { if (i != n) continue; else { i = 0; continue; } } j++; if (j == m) { j = 0; arr[i - 1] = 0; out[i - 1] = count; count++; } if (i == n) i = 0; if (count == n) { for (int j = 0; j < n; j++) { if (out[j] == 0) out[j] = count; } break; } } }
int cmp_arr(const void* p1, const void* p2) { return *(int*)p1 - *(int*)p2; } void sort( int a[], int n ) { qsort(a, n, sizeof(int), cmp_arr); }
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2) { if(list1 == NULL) return list2; else if(list2 == NULL) return list1; if(list1->data < list2->data) { list1->next = mergelists(list1->next, list2); return list1; } else { list2->next = mergelists(list1, list2->next); return list2; } }
这个可以采取递归也就是上述代码,比较两个链表中的值,找到一个较小值将它头插在已经排序好的链表上,举个例子
给定两个链表1->2->4
2->3->5
首先比较,显然l1->val较小,然后执行函数mergelists(list->next, list2)
int main() { int n, m, a[1000], b[1000]; scanf("%d%d",&n, &m); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } if(m>n) m=m-n; for(int i=0;i<n-m;i++) { b[i]=a[i]; } for(int i=0;i<m;i++) { a[i]=a[i+n-m]; } for(int i=0;i<n;i++) { if(i<n-m) a[i+m]=b[i]; if(i==0) printf("%d",a[i]); else printf(" %d",a[i]); } return 0; }
与力扣中的转轮数组一样,注意要考虑右移长度大于数组长度,可以采取取模的方式解决,除了上述方法,我们还可以用三步反转法
给定一个数组1 4 5 6 3 7,右移两个长度
先拆分成两部分1 4 5 3 6 7
第一部分反转4 1
第二部分反转7 6 3 5
和一块再反转5 3 6 7 1 4
int cmp_arr(const void* p1, const void* p2) { return *(int*)p1 - *(int*)p2; } int main() { int n, arr[n]; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&arr[i]); } qsort(arr, n, sizeof(int), cmp_arr); printf("min = %d",arr[0]); return 0; }
int main() { long long n; double h; scanf("%lf%lld", &h, &n); double s = 0; if (n == 0) { s = 0; h = 0; } else { s -= h; while (n > 0) { s += 2 * h; h /= 2; n--; } } printf("%.1lf %.1lf", s, h); return 0; }
int cmp_str(const void* p1, const void* p2) { return strlen(p1) - strlen(p2); } int main() { char str[200][100]; int i = 0; for (i = 0; ; i++) { scanf("%s", &str[i]); if (str[i][0] == '#') break; } qsort(str, i, sizeof(str[2]), cmp_str); for (int i = 0;; i++) { if (str[i][0] == '#') break; printf("%s ", str[i]); } return 0; }
int main() { int arr[1000], n, a = 0, sum = 1; char str; scanf("%d %c", &n, &str); for (int i = 0; i < 1000; i++) { if (i == 0) arr[i] = sum; else { sum += 2 * (2 * i + 1); arr[i] = sum; } } for (int i = n; i > 0; i--) { for (int j = 0; arr[j] <= i; j++) { if (i == arr[j]) a = j + 1; } if (a) break; } for (int i = a; i > 0; i--) { for (int k = 0; k < a - i; k++) printf(" "); for (int j = 0; j < 2 * i - 1; j++) printf("%c", str); printf("\n"); } for (int i = 2; i <= a; i++) { for (int k = 0; k < a - i; k++) printf(" "); for (int j = 0; j < 2 * i - 1; j++) printf("%c", str); printf("\n"); } printf("%d", n - arr[a - 1]); return 0; }
void Move(char* str, int a) { char* p = str; int i = 0; while (*p) { if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z')) { if (a > 0) { for (int i = 0; i < a % 26; i++) { *p += 1; if (*p == 'z' + 1) *p = 'a'; if (*p == 'Z' + 1) *p = 'A'; } } if (a < 0) { for (int i = 0; i < -a % 26; i++) { *p -= 1; if (*p == 'a' - 1) *p = 'z'; if (*p == 'A' - 1) *p = 'Z'; } } } str[i++] = *p; p++; } str[i] = '\0'; } int main() { char str[1000]; int n; gets(str); scanf("%d", &n); Move(str, n); printf("%s", str); return 0; }
int main() { double a, c; int b; scanf("%lf%d%lf",&a, &b, &c); if(b) { if(a*1.26>=c) printf("%.2lf T_T",a*1.26); else printf("%.2lf ^_^",a*1.26); } else { if(a*2.455>=c) printf("%.2lf T_T",a*2.455); else printf("%.2lf ^_^",a*2.455); } return 0; }
int main() { int a, b; scanf("%d%d",&a, &b); printf("%d",a+b-1); return 0; }
int cmp_arr(const void* p1, const void* p2) { return *(int*)p2 - *(int*)p1; } int main() { int n, arr[n]; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&arr[i]); } qsort(arr, n, sizeof(arr[0]), cmp_arr); for(int i=0;i<n;i++) { if(i==0) printf("%d",arr[i]); else printf(" %d",arr[i]); } return 0; }
int main() { int n, arr[1000][1000]; scanf("%d", &n); for (int i = 0; i < n; i++) { for(int k=0;k<n-i-1;k++) printf(" "); for (int j = 0; j <= i; j++) { if (j == 0 || j == i) { arr[i][j] = 1; printf("%4d", arr[i][j]); } else { arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1]; printf("%4d", arr[i][j]); } } printf("\n"); } return 0; }