题目一:
题目描述:
牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。
解题思路:
用普通的遍历是没办法走到最后的,数据一但非常大时,时间复杂度就会报错,这里就需要推导一下数学公式:(n / y) * (y - k) + ((n % y < k) ? 0, (n % y - k + 1));
当 y <=k 时,意味着任何数字取模y的结果都在 [0, k-1]之间,都是不符合条件的。
当 y = k+1=4 时,x符合条件的数字有 3,7
当 y = k+2=5 时,x符合条件的数字有 3,4,8,9
当 y = k+3=6 时,x符合条件的数字有 3,4,5,9,10
当 y = k+n时,x小于y当前值,且符合条件的数字数量是:y-k个,
x大于y当前值,小于2*y的数据中,且符合条件的数字数量是:y-k个
从上一步能看出来,在y的整数倍区间内,x符合条件的数量就是 (n / y) * (y - k)个
n / y 表示有多少个完整的 0 ~ y区间, y - k 表示有每个区间内有多少个符合条件的数字
最后还要考虑的是…往后这种超出倍数区间超过n的部分的统计n % y 就是多出完整区间部分的数字个数,其中k以下的不用考虑,则符合条件的是 n % y - (k-1) 个 这里需要注意的是类似于9这种超出完整区间的数字个数 本就小于k的情况,则为0
代码实现:
#include<stdio.h> int main() { long n, k = 0; long count = 0; while (~scanf("%ld %ld", &n, &k)) { if (k == 0) { printf("%ld\n", n * n); continue; } for (long j = k + 1; j <= n; j++) { long help = n % j < k ? 0 : (n % j) - k + 1; count += (j - k) * (n / j) + help; } printf("%ld\n", count); } return 0; }
结果情况:
符合题目要求,问题得到解决。
题目二:
题目描述:
输入一个字符串和一个整数 k ,截取字符串的前k个字符并输出
数据范围:字符串长度满足 1≤n≤1000 , 1≤k≤n
输入描述:
1.输入待截取的字符串
2.输入一个正整数k,代表截取的长度
输出描述:
截取后的字符串
解题思路:
1.输入待截取的字符串
2.输入一个正整数k,代表截取的长度
3.遍历输出len长度字符
代码实现:
#include<stdio.h> #include<string.h> int main() { // 输入一个字符串和一个整数 k ,截取字符串的前k个字符并输出 int len; char str[1000]; // 1.输入待截取的字符串 gets(str); // 2.输入一个正整数k,代表截取的长度 scanf("%d", &len); for (int i = 0; i < len; i++) { printf("%c", str[i]); } return 0; }
结果情况:
符合题目要求,问题得到解决。
总结:
文章到这里就要告一段落了,有更好的想法或问题,欢迎评论区留言。
希望今天的练习能对您有所收获,咱们下期见!