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;
}