参考如下:
#include <stdio.h>
int main()
{
int a, i;
for (i = 0; i < 5; i++)
{
scanf("%d", &a);
if (a % 3 == 0)
printf("%d ", a);
}
return 0;
}
方法1:
#include <stdio.h>
#include <string.h>
int main(void)
{
char c[200], c1;
int i, j, k;
printf("Enter a string: ");
scanf("%s", c);
k = strlen(c);
for (i = 0, j = k - 1; i<k/2;i++,j--)
{
c1 = c[i];
c[i] = c[j];
c[j] = c1;
}
printf("%s\n", c);
return 0;
}
运行结果:
存在的问题:如果输入:hello world,情况是啥?
方法2和方法3:
//字符串逆序
#include <stdio.h>
#include <string.h>
//实现方式1:数组方式
void str_reverse(char *str) {
int low=0, high;
char temp;
high = strlen(str) - 1;
while(low < high) {
temp = str[low];
str[low] = str[high];
str[high] = temp;
low++;
high--;
}
}
//实现方式2;指针方式
void str_reverse1(char *str) {
char temp;
char *p, *q;
int n;
p = str; //指向数组首地址
n = strlen(str);
q = &str[n-1]; //指向数组末地址
while (p < q) {
temp = *p;
*p = *q;
*q = temp;
p++;
q--;
}
}
int main() {
char a[] = {"abcdefg"};
printf("逆序前的字符串:%s\n", a);
str_reverse(a);
printf("逆序后的字符串:%s\n",a);
str_reverse1(a);
printf("逆序后的字符串:%s\n", a);
return 0;
}
输出结果:
题目难度尚可,实现就比较麻烦了,以下就是代码——
#include <cstdio>
// Gcd是求[项-数对],含义如下
// Input: 5, 2
// Ouput: {3, 5}
void Gcd(const int n, const int m, int& gcd, int* gcd_list) {
gcd = n;
int tmp = 0; // 余数
while (m != 0) {
tmp = gcd % m;
gcd = m;
m = tmp;
}
if (1 == gcd) {
return;
}
int* p = gcd_list;
// “求[项-数对]” 的过程
// 其中对于同一个gcd,它有多个对应的列表项
// 用 *p = (xi,yi) 表示下标为i的项
// 如 { (x1,y1), (x2,y2), (x3,y3) }
// 对应的 gcd 则为 n
// 例如 x1,x2,x3 本身是关于 n 区域内均匀分布的
// 而在同一 项-数 对中,它们对应的 y 值是有规律的
// 详见中间的print
for (int i = 1; i < gcd; ++i) {
if (gcd % i == 0) {
// 因为 x 是 y 的唯一值,所以在[1,n)范围内只会有一个x对应i
*p++ = i;
*p++ = (n - i);
}
}
}
void RotateArray(int n, int m, int* a) {
if (m > n) {
// 该情况下只需要将m对n取余即可
m %= n;
}
int gcd = 0;
int gcd_list[n] = { 0 };
// n,m,gcd,gcd_list均为输出参数
// 形参n表示原始数组a中元素个数
// 形参m表示右移的位数
// gcd和gcd_list是“项-数 对应表”
Gcd(n, m, gcd, gcd_list);
// 遍历“项-数 对应表”,更新数组 a
// 如此遍历的目的是尽可能不遗漏地移动所有元素
int* p = gcd_list;
for (; *p != 0; ++p) {
const int gi = *p; // gcd_list[n] 中下标
const int delta = n / gcd; // 子区间中的数目
const int round = gcd - 1; // 需要轮换交换的轮数
for (int i = 0; i < round; ++i) {
int tmp = a[delta * i + gi];
for (int j = 0; j < gcd - 1; ++j) {
int pos = delta * ((i + 1) * j % round) + gi;
int tmp2 = a[pos];
a[pos] = tmp;
tmp = tmp2;
}
}
}
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
int a[n] = { 0 };
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
RotateArray(n, m, a);
printf("%d", a[0]);
for (int i = 1; i < n; ++i) {
printf(" %d", a[i]);
}
printf("\n");
return 0;
}